我想知道是否有办法在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)
答案 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)
并获得所需的结果。