0

我正在尝试使用

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

我不想在a之前用 global 定义。

可能吗?或类似的东西

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

当我使用print(my_function()).

4

3 回答 3

4

您可以将默认设置None

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

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

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

_sentinel = object()

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

现在您可以调用my_function(11, None)and bwill be set to None,在不指定的情况下调用它b(例如my_function()my_function(42), andb将被设置为任何a设置。

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

于 2013-11-08T15:42:20.373 回答
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)
于 2013-11-08T16:05:13.227 回答
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
于 2013-11-08T16:00:31.717 回答