【问题标题】:Shortcut for method parameter方法参数的快捷方式
【发布时间】:2011-06-20 03:33:36
【问题描述】:

我想知道是否有办法在 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


【解决方案1】:

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

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

【讨论】:

  • 我要问的问题不是如何设置可选参数,而是如何仅在设置“somevar”时传递参数。
  • @Hanpan -- somevar 可以是None,还是总是不是None
  • 它将被设置或不存在。尝试传递 somevar 而不首先定义它会导致它抛出错误。抱歉,如果我的问题不清楚。
  • @Hanpan -- 所以,如果somevar 存在于当前上下文中,您想提取它的值并将其用于param2
【解决方案2】:

可能你需要类似defined() 的 php.ini 文件。 在 Python 中检查不合格名称的存在是不习惯的。定义或不定义名称并依赖它是不好的做法。

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

所以你可以传递locals().get('somevar', None) or globals().get('somevar', None) 之类的东西来尝试首先在本地上下文中找到somevar,然后在全局上下文中。但除非绝对必要,否则我不鼓励你这样做。

【讨论】:

    【解决方案3】:

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

    somevar = None
    

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

    param2 == None
    

    这样你总是会调用方法

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

    并得到想要的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多