为了避免出现明显的错误,我想阻止使用带有某些函数的位置参数。有什么办法可以实现吗?python:是否有可能要求函数的参数都是关键字?
3
A
回答
19
只有Python 3中可以适当做(和你使用的python3标签,所以它的精细):使用**kwargs
将让用户输入任何参数,除非你以后检查
def function(*, x, y, z):
print(x,y,z)
。而且,它会从内省中隐藏真实的参数名称。
**kwargs
不是这个问题的答案。
测试程序:
>>> function(1,2,3)
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
function(1,2,3)
TypeError: function() takes exactly 0 positional arguments (3 given)
>>> function(x=1, y=2, z=3)
1 2 3
2
是的,只需使用**kwargs
结构,只从那里读取您的参数。
def my_function(**kwargs):
for key, value in kwargs.iteritems():
print ("%s = %s" % (key, value))
my_function(a="test", b="string")
+0
不,这将接受任何论点,除非你稍后检查... – JBernardo
+0
嘿downvoters:可以告诉我这不符合OP的要求?确切的话:“防止使用位置参数”。没有其他人被指定。 –
6
您可以定义一个装饰器,如果装饰的函数使用任何位置参数,则使用内省会导致错误。这样可以防止使用的某些函数的位置参数,同时允许您根据需要定义这些函数。
作为一个例子:
def kwargs_only(f):
def new_f(**kwargs):
return f(**kwargs)
return new_f
要使用它:
@kwargs_only
def abc(a, b, c): return a + b + c
不能使用它从而(错误类型):
abc(1,2,3)
可以使用它从而:
abc(a=1,b=2,c=3)
更强大的解决方案将使用decorator
模块。
声明:深夜答案不能保证!
相关问题
- 1. Python argparse的参数是python关键字
- 2. Python命名的参数是关键字?
- 3. 是否有可能绕过C#函数参数强打字?
- 4. 可以PHP函数有关键字参数? (如Python)
- 5. 在函数参数中使用auto关键字是否正确?
- 6. 你能否要求函数参数是函数类的静态常量?
- 7. 是否有可能有匿名函数的参数?
- 8. 是否有可能在t-sql中没有参数的函数?
- 9. 是否有可能解决异步函数没有return关键字
- 10. Python中是否有函数作为主要参数C
- 11. 是否有可能使用高阶函数与可选参数
- 12. 是否有可能在Python中获取关键字列表?
- 13. Python的关键字参数
- 14. 可能宏参数的名称是关键字吗?
- 15. Spring是否要求所有的bean都有默认的构造函数?
- 16. 是否有可能拥有带参数的Python类装饰器?
- 17. 是否有可能在XML中传递构造函数参数?
- 18. 是否有可能将函数作为参数传递给c?
- 19. 是否需要验证函数参数?
- 20. 是否可以使用查询参数填充IN关键字
- 21. 是否所有MapReduce实现都将键参数输入到reduce函数中?
- 22. 是否有可能从参数
- 23. 是否有可能在运行时用参数生成一个Python函数?
- 24. python是否有“causes_exception()”函数?
- 25. Django TypeError:'bar'是这个函数的无效关键字参数
- 26. Django:“state”是此函数的无效关键字参数
- 27. 'x'是这个函数的无效关键字参数
- 28. Django:TypeError:'username'是此函数的无效关键字参数
- 29. TypeError:'ndim'是此函数的无效关键字参数
- 30. 是否有可能将“关键字”也视为“非关键字”的语法?
为什么这样做?我们都在这里同意大人,对吧? – ktdrv
答案其实很简单:不。我知道,你可能会认为有一个很棒的用例可以解决一些出色的问题,但相信我,你们正在反对语言的基本哲学 - 我们都赞同成年人。这只会导致悲伤去追求这样一个过程。 – cwallenpoole
这听起来像是一个愚蠢的事情_enforce_。然而,如果你喜欢,你可以养成在函数调用时通过名字指定位置参数的习惯。这样,如果位置参数的名称发生变化,调用者将得到一个TypeError(这是你试图避免的那种明显的错误?)。 – wim