gpt4 book ai didi

python - namedtuple 字段在初始化期间的类型转换

转载 作者:太空狗 更新时间:2023-10-30 00:16:17 28 4
gpt4 key购买 nike

我有一个类,它几乎没有静态字段,并且是从可迭代对象初始化的(比如 csvreader 的输出)。 __init__ 为其中一些执行从字符串到数字的类型转换:

class PerformanceTestResult(object):
def __init__(self, csv_row):
# csv_row[0] is just an ordinal number of the test - skip that
self.name = csv_row[1] # Name of the performance test
self.samples = int(csv_row[2]) # Number of measurement samples taken
self.min = int(csv_row[3]) # Minimum runtime (ms)
self.max = int(csv_row[4]) # Maximum runtime (ms)
self.mean = int(csv_row[5]) # Mean (average) runtime (ms)
self.sd = float(csv_row[6]) # Standard deviation (ms)

我正在考虑将它转换为一个 namedtuple,因为它没有太多其他内容。但我想在初始化期间保持类型转换。有没有办法用 namedtuple 做到这一点? (我没有注意到 namedtuple 工厂方法的详细输出中的 __init__ 方法,这让我暂停了默认初始化程序的工作方式。)

最佳答案

您可以使用解包运算符 *解包,而不是按原样传递 csv_row。例如:

>>> def f(a, b):
... return a + b
...
>>> csv_row = [1, 2]
>>> f(*csv_row) # Instead of your current f(csv_row)

这也适用于 namedtuple,因为参数的顺序将在解包时保持不变:

>>> from collections import namedtuple
>>> PerformanceTestResult = namedtuple('PerformanceTestResult', [
... 'name',
... 'samples',
... 'min',
... 'max',
... 'mean',
... 'sd',
... ])
>>> test_row = ['test', '123', 2, 5, 3, None] # from your csv file
>>> ptr = PerformanceTestResult(*test_row)
>>> ptr
PerformanceTestResult(name='test', samples='123', min=2, max=5, mean=3, sd=None)

这不仅允许您使用 namedtuple,这在这里似乎是一个非常好的主意,而且还消除了您的 PerformanceTestResult 了解有关CSV 文件!抽象很好,因为现在您可以使用同一个类,而不管数据来自何处以及采用何种格式。


如果您需要 int()float() 转换,您将不得不编写一个单独的转换函数。您可以通过子类化将其构建到 PerformanceTestResult 中:

_PerformanceTestResult = namedtuple('PerformanceTestResult', [...])

class PerformanceTestResult(_PerformanceTestResult):
@classmethod
def from_csv(cls, row):
return cls(
row[0],
int(row[1]),
int(row[2]),
int(row[3]),
int(row[4]),
int(row[5]),
float(row[6])
)

可以这样使用:

>>> ptr = PerformanceTestResult.from_csv(your_csv_row)

或者您可以创建一个单独的转换函数:

def parse_csv_row(row):
return (row[0], int(row[1]), ...)

现在使用它在解包之前转换行:

>>> ptr = PerformanceTestResult(*parse_csv_row(your_csv_row))

关于python - namedtuple 字段在初始化期间的类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44614504/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com