Python 方法参数的快捷方式

Python 方法参数的快捷方式,python,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) 关键字参数默认为函数定义中提

我想知道在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)

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

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

可能您需要php的
defined()
之类的东西。 Python中不习惯检查是否存在非限定名称。定义或不定义名称并依赖它是一种不好的做法

尽管您可以访问函数的局部变量作为
locals()
,全局变量作为
globals()
;两者都返回一个dict


因此,您可以传递类似于
locals().get('somevar',None)或globals().get('somevar',None)
的消息,以尝试首先在本地上下文中查找
somevar
,然后在全局上下文中查找。但除非绝对必要,否则我不鼓励你这么做。

你不是故意试图通过引用潜在的不存在的变量来制造一个悖论吗?在我看来,这似乎是非常糟糕的编码实践。肖恩展示的方式才是前进的方向。在代码中,您应该始终首先声明

somevar = None
因此,如果您将该变量传递给您的方法,那么如果您以后没有更改该值,则该变量将为“无”。然后在方法定义中检查

param2 == None
这样,您将始终调用该方法

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

我要问的问题不是如何设置可选参数,而是如何仅在设置了“somevar”时传递参数。@Hanpan--
somevar
是否可以
None
,或者它是否总是非
None
?它要么被设置,要么不存在。试图在不首先定义somevar的情况下传递它会导致它抛出错误。如果我的问题不清楚,很抱歉。@Hanpan--那么,如果
somevar
的值存在于当前上下文中,您希望将其用于
param2
?的可能重复项