函数默认值未定义

时间:2013-11-08 15:40:46

标签: python function python-3.x

我正在使用python 3.3

我正在尝试使用

def my_function(a,b)

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

我想使用默认值,所以当我使用时,print(my_function()) a = 10,b = a 所以我试过了 def my_function(a = 10,b = a) 我得到了“未定义” 我不希望在全局之前定义“a”我想要使用这样的东西 “def my_function(a = 10,b = a)” 可能吗?或类似的东西

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

当我使用“print(my_function())”时这不起作用 提前致谢  大卫

3 个答案:

答案 0 :(得分:2)

您可以将默认设置为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将设置为a设置的任何内容。

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

答案 1 :(得分:0)

这个函数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

答案 2 :(得分:0)

哼!我不能像这样定义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)