Python 未定义函数默认值

Python 未定义函数默认值,python,function,python-3.x,Python,Function,Python 3.x,我正在使用python 3.3 我想用 def my_function(a,b) 如果我试着像这样打印函数 print(my_function()),当值从none开始时,我得到 “缺少2个必需的位置参数” 我想使用默认值,因此在使用时,print(my_function()) a=10和b=a 所以我试过了 def my_功能(a=10,b=a) 我得到了“一个未定义的” 在使用global之前,我不想定义“a”,我想使用类似的东西 “定义我的函数(a=10,b=a)” 可能吗?或者类似的事

我正在使用python 3.3

我想用

def my_function(a,b)
如果我试着像这样打印函数
print(my_function())
,当值从none开始时,我得到 “缺少2个必需的位置参数”

我想使用默认值,因此在使用时,
print(my_function())
a=10和b=a 所以我试过了 def my_功能(a=10,b=a) 我得到了“一个未定义的” 在使用global之前,我不想定义“a”,我想使用类似的东西 “定义我的函数(a=10,b=a)” 可能吗?或者类似的事情

def my_function(a,b)
    if a == None:
        a = 10
    if b == None:
        b = a
当我使用“print(my_function())时,这也不起作用。” 提前谢谢 David

您可以将默认设置为
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_函数(11,None)
并且
b
将被设置为
None
,在不指定
b
的情况下调用它(例如
my_函数()
my_函数(42)
,并且
b
将被设置为
a
设置为的任何值

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

此函数my_函数(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

哼!我觉得你不能像这样定义我的函数。但是你可以用装饰器来隐藏默认值

例如:

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)

省略
有时是一个很好的哨兵值,当你需要接受
时。它内置在Python中,但除了编写
\uu getitem\uuuuuuuu
\uuuuuu setitem\uuuuuuuuuuuu
方法之外,几乎没有其他用途。@kindall:我更喜欢明确地说明这一点。
省略
是一个很大的文档WTF;它看起来不太像p这同样适用于
NotImplemented
。实际上,如果您只是想用其他值(例如空列表)替换它,那么没有任何sentinel值是非常自我记录的在代码本身。我想你可以给你的sentinel命名为
DefaultEmptyList
之类的东西。@kindall:
\u sentinel
清楚地记录了它的功能。
省略号
没有。