Python 未定义函数默认值
我正在使用python 3.3 我想用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)” 可能吗?或者类似的事
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
清楚地记录了它的功能。省略号
没有。