2011-10-02 54 views
3

为了避免出现明显的错误,我想阻止使用带有某些函数的位置参数。有什么办法可以实现吗?python:是否有可能要求函数的参数都是关键字?

+2

为什么这样做?我们都在这里同意大人,对吧? – ktdrv

+1

答案其实很简单:不。我知道,你可能会认为有一个很棒的用例可以解决一些出色的问题,但相信我,你们正在反对语言的基本哲学 - 我们都赞同成年人。这只会导致悲伤去追求这样一个过程。 – cwallenpoole

+0

这听起来像是一个愚蠢的事情_enforce_。然而,如果你喜欢,你可以养成在函数调用时通过名字指定位置参数的习惯。这样,如果位置参数的名称发生变化,调用者将得到一个TypeError(这是你试图避免的那种明显的错误?)。 – wim

回答

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模块。

声明:深夜答案不能保证!

相关问题