具有默认值的 NamedTuple

NamedTuple with default values

我正在尝试使用一个参数为 namedTuple 且具有默认值的函数。 我试过了。这有可能吗?

from typing import Optional, NamedTuple
    
Stats = NamedTuple("Stats", [("min", Optional[int]), ("max", Optional[int])])
    
def print(value1: Stats=None, value2: Stats=None):
    print("min: ", value1.min)
    print("max: ", value1.max)
        
print()

重命名你的 print() 函数,首先你使用的是内置函数名称 print,这是一种糟糕的风格,其次你制作了一个在 print() 中对 print() 的递归调用(我确定你是想在函数体内调用实际的内置 print())。

其次,使用collection.namedtuple class实现元组的实际类型,如下所示:

也不需要类型注释。

Try it online!

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,请执行以下操作:

Try it online!

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))