2017-06-18 31 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))