初始化期间namedtuple字段的类型转换
问题描述:
我有一个静态字段很少的类,并且从迭代中初始化(类似于csvreader
的输出)。从字符串__init__
进行类型转换为数字为其中的一些:初始化期间namedtuple字段的类型转换
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))
你有没有想要你的namedtuple看起来如何的例子? – user1767754