2011-02-02 72 views
0

我想知道是否有办法做这样的事情在Python:快捷方式方法参数

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

我想通过,如果somevar设置的参数2,或无,如果事实并非如此。基本上,我在寻找这样的一个较短的方式:

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

[有条件地将任意数量的默认命名参数传递给函数](http:// stackoverflow。com/questions/4670665/conditionally-passing-arbitrary-number-of-default-named-arguments-to-a-function) – SilentGhost 2011-02-02 18:21:37

回答

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. 

考虑:

print first_value, special_variable_name or second_value or "World!" 

然后:

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! 

如果您想打印一个局部变量的值,你可以通过添加预期的变量名的定义做,如果您使用该名称定义变量:

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

但是不要这样做 - 这是意想不到的,魔术和绝对是 un-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 
+0

我在问的不是如何设置一个可选参数,而是如何只传递参数当“somevar”被设置时。 – Hanpan 2011-02-02 17:39:33

2

可能你需要类似defined()的php。 Python中不检查是否存在不合格的名称。有一个名称或定义或取决于它是不好的做法。

虽然您可能访问函数的局部变量如locals()和全局变量为globals();都返回一个字典。

因此,您可以通过类似locals().get('somevar', None) or globals().get('somevar', None)的尝试,首先在本地环境中查找somevar,然后在全局环境中查找。但是我劝你不要这样做,除非绝对必要。

2

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

somevar = None 

因此,如果您传递变量的方法,这将是无如果没有后来就改变了价值。然后在方法定义是否

param2 == None 

这样,你总是会调用该方法

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

,并得到想要的结果。