2017-06-18 30 views
4

我有一个静态字段很少的类,并且从迭代中初始化(类似于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__方法。)

+0

你有没有想要你的namedtuple看起来如何的例子? – user1767754

回答

0

不是传递在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))