重命名你的print()
函数,首先你使用了内置函数名
print
,这是不好的风格,其次你在
print()
内部进行了递归调用(我确定你想在函数体内调用实际内置的
print()
)。
其次,使用collection.namedtuple
类来实现元组的实际类型,如下所示:
此外,不需要使用类型注释。
在线试用!
from collections import namedtuple
StatsTup = namedtuple('Stats', ['min', 'max'], defaults = [3, 7])
def printf(value1 = StatsTup(), value2 = StatsTup(max = 10)):
print("min1: ", value1.min)
print("max1: ", value1.max)
print("min2: ", value2.min)
print("max2: ", value2.max)
printf()
printf(StatsTup(12, 14), StatsTup(16, 18))
输出:
min1: 3
max1: 7
min2: 3
max2: 10
min1: 12
max1: 14
min2: 16
max2: 18
正如您在上面的代码和输出中所看到的,我将命名元组作为函数的默认参数传递。如果您提供
defaults = [...]
,则可以省略元组字段的值,就像我所做的那样。如果您提供这样的默认值,则可以不提供元组的任何值,例如
StatsTup()
,或者提供一些值,例如
StatsTup(max = 123)
,或者提供所有值,例如
StatsTup(min = 20, max = 35)
。
上述解决方案仅适用于从
Python 3.7
开始的版本,对于旧版本的Python,请执行以下操作:
在线尝试!
from collections import namedtuple
StatsTup = namedtuple('Stats', 'min max')
StatsTup.__new__.__defaults__ = (3, 7)
def printf(value1 = StatsTup(), value2 = StatsTup(max = 10)):
print("min1: ", value1.min)
print("max1: ", value1.max)
print("min2: ", value2.min)
print("max2: ", value2.max)
printf()
printf(StatsTup(12, 14), StatsTup(16, 18))
typing.NamedTuple
?为什么不使用class(NamedTuple): ...
,这才是重点呢? - juanpa.arrivillagaStats._field_defaults
。 - juanpa.arrivillaga