【问题标题】:function default value not defined函数默认值未定义
【发布时间】:2013-11-08 15:40:45
【问题描述】:

我正在尝试使用

def my_function(a,b)

如果我尝试打印这样的功能 print(my_function()),当值从无开始时,我得到 “缺少 2 个必需的位置参数”

我想使用默认值,所以当我使用时,print(my_function())a=10b=a

所以我尝试了

def my_function(a=10,b=a)

我得到了a not defined

我不想在之前用 global 定义 a

有可能吗?或类似的东西

def my_function(a,b)
    if a == None:
        a = 10
    if b == None:
        b = a

当我使用 print(my_function()) 时,这也不起作用。

【问题讨论】:

    标签: python function python-3.x


    【解决方案1】:

    您可以将默认设置为None:

    def my_function(a=10, b=None):
        if b is None:
            b = a
    

    这里a 的默认值为10,如果保留默认值,b 将设置为a

    如果您还需要接受None,请选择一个不同的、唯一的默认值作为哨兵。 object() 的实例是一个常用的约定:

    _sentinel = object()
    
    def my_function(a=10, b=_sentinel):
        if b is _sentinel:
            b = a
    

    现在您可以调用my_function(11, None) 并且b 将被设置为None,调用它时不指定b(例如my_function()my_function(42),而b 将设置为@987654337 @ 被设置为。

    除非参数有默认值(例如是关键字参数),否则它们是必需的

    【讨论】:

    • 当您需要接受None 时,Ellipsis 有时是一个很好的标记值。它内置在 Python 中,但除了编写 __getitem____setitem__ 方法之外几乎没有任何用途。
    • @kindall:我更喜欢明确说明这一点。 Ellipsis 是一个大文档 WTF;它看起来不合适,不清楚您只是将它用作哨兵。这同样适用于NotImplemented
    • 真的,no 标记值是非常自我记录的,如果您只是要在代码本身中用其他值(例如空列表)替换它。我想您可以将您的哨兵命名为 DefaultEmptyList 之类的名称。
    • @kindall:_sentinel清楚地记录了它的功能。 Ellipsis 没有。
    • @kindall 要获得repr中的名字,你可以使用一个类:class _Sentinel: pass_sentinel = _Sentinel() ... help(my_function) -> ... my_function(a=10, b=<..._Sentinel object at 0x...>)
    【解决方案2】:

    这个函数 my_function(a,b) 需要两个没有默认值的位置参数,所以如果没有传递它们就不能调用它

    所以主要问题是我们如何传递两个参数,以便第二个在没有传递的情况下设置为第一个

    有两种方法:

    kwargs 拆包

    def my_function(a=10, **kwargs):
        b = kwargs.get('b', a)
    

    sentinel 作为默认值

    _sentinel = object()
    def my_function(a=10, b=_sentinel):
        if b is _sentinel:
            b = a
    

    【讨论】:

      【解决方案3】:

      哼!我觉得你不能像这样定义my_function。但是您可以使用装饰器来隐藏默认值计算。

      例如:

      import functools
      
      
      def my_decorator(f):
          @functools.wraps(f)
          def wrapper(a=10, b=None):
              if b is None:
                  b = a
              return f(a, b)
          return wrapper
      

      然后你可以像这样定义你的函数:

      @my_decorator
      def my_function(a, b):
          return (a, b)
      

      您可以使用带有零个、一个或两个参数的函数:

      >>> print(my_function())
      (10, 10)
      >>> print(my_function(5))
      (5, 5)
      >>> print(my_function(5, 12))
      (5, 12)
      

      【讨论】:

        猜你喜欢
        • 2011-08-26
        • 2021-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多