我正在使用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())”时这不起作用 提前致谢 大卫
答案 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)