带有默认值的命名元组

9

我正在尝试使用一个带有默认值的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()

你为什么要使用这种形式的 typing.NamedTuple?为什么不使用 class(NamedTuple): ...,这才是重点呢? - juanpa.arrivillaga
请注意,添加默认值的方法是将其分配给 Stats._field_defaults - juanpa.arrivillaga
@juanpa.arrivillaga,你能否举个例子? - user17572769
一个例子? - juanpa.arrivillaga
你正在考虑的解决方案是 @juanpa.arrivillaga 提出的。 - user17572769
1个回答

5
重命名你的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))

留下 Stats = NamedTuple("Stats", [("min", Optional[int]), ("max", Optional[int])]) 的意义是什么? - juanpa.arrivillaga
@juanpa.arrivillaga 留下类型注释的唯一目的是如果需要注释,那么就不需要它。 我保留了它们,只是因为原始 OP 的问题包含它们,所以我改进了那段代码。 但无论如何感谢您指出这一点,我刚刚更新了我的答案,包括没有任何类型注释的更简洁版本。 - Arty
但这没有意义,它没有对StatsTup进行类型注释,而你最终使用的就是它。 - juanpa.arrivillaga
不幸的是,它不适用于Python 3.6.7,有其他解决方案吗? - user17572769
@Arty 但它不会为您使用collections.namedtuple创建的类进行注释,无论如何,在Python 3.6中,您可以使用带有注释的class Stats(NamedTuple): ...,甚至可以使用默认值,例如 min: Optional[int] = None - juanpa.arrivillaga
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接