方法参数的快捷方式

时间:2011-02-02 17:32:35

标签: python

我想知道是否有办法在Python中做这样的事情:

some_method(param1="param1", param2 = somevar or None)

如果设置了somevar,我想传递param2,如果不设置则传递None。基本上我正在寻找一种更短的方法:

if somevar is None:
some_method(param1="param1")
else:
some_method(param1="param1", param2=somevar)

3 个答案:

答案 0 :(得分:3)

关键字参数默认为您在函数定义中提供的参数。

def some_method(param1="param1", param2=None):
    # param1 is "param1" unless some other value is passed in.
    # param2 is None if some value is not passed for it.

考虑:

def print_values(first_value="Hello", second_value=None):
    print first_value, second_value or "World!"

print_values() #prints Hello World!
print_values(first_value="Greetings") #prints Greetings World!
print_values(second_value="You!") # prints Hello You!
print_values(first_value="Greetings", second_value="You!")
# prints Greetings You!

如果要打印局部变量的值,可以通过将预期变量名添加到定义中来实现:

print first_value, special_variable_name or second_value or "World!"

然后,如果您使用该名称定义变量:

special_variable_name = "Sean"
print_values() # prints Hello Sean

但是不要这样做 - 这是意料之外的,魔术和绝对取消Pythonic - 将您需要的值作为第二个参数传递。

如果您需要能够在没有错误的情况下使用该变量调用它,那么请确保在模块顶部定义该变量。

special_variable_name = None
# ... much code later ...
special_variable_name = "Sean" #This can be commented out
print_values(second_value=special_variable_name) # prints Hello Sean

答案 1 :(得分:2)

可能你需要像php defined()这样的东西。 在Python中检查是否存在不合格的名称是不习惯的。有一个名称是否已定义且依赖于它是不好的做法。

虽然您可以将函数的局部变量作为locals()访问,将全局变量作为globals()访问;都返回了一个字典。

因此,您可以传递locals().get('somevar', None) or globals().get('somevar', None)之类的内容,首先尝试在本地环境中找到somevar,然后在全局环境中找到{{1}}。但除非绝对必要,否则我不鼓励你这样做。

答案 2 :(得分:2)

你是不是故意试图通过引用可能不存在的变量来创建一个悖论?这对我来说似乎编码很糟糕。肖恩表明的方式是要走的路。在您的代码中,您应该首先声明

somevar = None

因此,如果您将该变量传递给您的方法,那么如果您之后没有更改该值,则该变量将为None。然后在方法定义中检查是否

param2 == None

这样你总是会调用方法

some_method(param1 = "param1", param2 = somevar)

并获得所需的结果。