【问题标题】:python variable value to trigger parameter defaultpython变量值触发参数默认值
【发布时间】:2013-06-29 22:23:03
【问题描述】:

在 Python 中,是否可以为变量设置一个值,以便在将其传递给函数时,该函数将使用参数的默认值?例如:

def my_function( a = "default_value" ) :
    print a

my_function( my_variable )

将打印“默认值”。这样做会是 Pythonic 吗?

【问题讨论】:

    标签: python argument-passing


    【解决方案1】:

    你通常会这样做;你把参数完全去掉,让python来填写默认值:

    my_function()
    

    您可以使用 inspect.getargspec() function 从函数中检索默认值。

    from inspect import getargspec
    
    defaults = getargspec(my_function).defaults
    my_variable = defaults[0]
    my_function(my_variable)
    

    你的例子当然很简单;它只需要 one 你知道有一个默认值的参数。在更常见的情况下,还有位置参数,它们没有默认值。

    要重构哪些参数具有默认值,您需要重新组合参数及其默认值:

    argspec = getargspec(my_function)
    keyword_args = dict(zip(argspec.args[-len(argspec.defaults):], argspec.defaults))
    positional_args = [None] * (len(argspec.args) - len(argspec.defaults))  # set all positionals to None
    my_function(*positional_args, **keyword_args)
    

    演示:

    >>> from inspect import getargspec
    >>> defaults = getargspec(my_function).defaults
    >>> my_variable = defaults[0]
    >>> my_function(my_variable)
    default_value
    >>> argspec = getargspec(my_function)
    >>> keyword_args = dict(zip(argspec.args[-len(argspec.defaults):], argspec.defaults))
    >>> positional_args = [None] * (len(argspec.args) - len(argspec.defaults))  # set all positionals to None
    >>> my_function(*positional_args, **keyword_args)
    default_value
    >>> keyword_args
    {'a': 'default_value'}
    

    【讨论】:

      【解决方案2】:

      使用默认参数的一个常见习惯用法是,除了不传递值之外,将参数设置为默认值为 None,然后如果它是 None,则使用默认值,例如:

      def my_function(a=None):
          if a is None:
             a = "default_value"
          print a
      

      然后你可以将None 传递给函数,它不会杀死默认参数。

      my_variable = None
      my_function(my_variable) # prints 'default_value'
      

      如果您有多个具有相似签名的函数,您可能希望这样做,例如:

      def func1(a=None, b=None):
          print b
          func2(a)
      
      def func2(a=None):
          if a is None:
              a = 'default value'
          print a
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 2016-06-15
        • 2016-11-11
        • 2012-08-01
        • 2011-11-29
        • 1970-01-01
        • 2012-06-25
        相关资源
        最近更新 更多