2017-08-12 119 views
0

所以我對這個現有的代碼庫擁有約150個左右的功能時間序列如何處理功能的巨大集合在Python 2.7

我想將它們存儲在一類,以防止命名工作污染。

這是存在

import some.module 
def func1(start_date, end_date): 
    some code here 
    return time_series 
def func2(start_date, end_date): 
    some code here 
    return time_series 
. 
. 
. 
def func150(start_date, end_date): 
    some code here 
    return time_series 

這些功能的每一個都是不存在任何圖案的唯一名稱。我累了把它們放在一類

def function_builder(some_data): 
    def f(start_date, end_date): 
     some_code_here() 
     return series 
    return f 

class TimeSeries(): 
    func1 = function_builder(some_data) 
    func2 = function_builder(some_other_data) 
    . 
    . 
    . 
    func150 = function_builder(some_other_other_data) 

我的希望是,這將導致我只是能夠導入的時間序列,並使用它像

from some.location import TimeSeries as ts 
#Actual code use 
data = ts.func1(start_date, end_date) 

但是這種做法引發以下錯誤

類型錯誤:未綁定的方法F()必須與TimeSeries的實例作爲第一個參數來調用(有日期代替)

請告訴我應該如何進行一個巨大的功能集合。我是編程新手,我想正確地做到這一點。

+0

你得到的不受約束的方法錯誤,因爲你試圖調用類的方法,而不首先構建一個類的實例。如果這些功能已經在使用中,那麼將它們全部整理到一個班級中可能不是您的解決方案。 – rug3y

+0

這不是課堂上最好的用法。爲什麼不把他們放在一個字典或什麼東西? –

+0

字典不是一個壞主意。我在考慮在有人告訴我可以使用類作爲名稱空間 –

回答

0

您可能更適合創建子模塊,而不是具有多個功能的類。不過,如果你真的要做到這一點,你所描述的方式,你需要使用靜態方法,而不是方法:

class TimeSeries(): 
    func1 = staticmethod(function_builder(some_data)) 
    func2 = staticmethod(function_builder(some_other_data)) 
    # ... 

或者,因爲你已經有function_builder

def function_builder(some_data): 
    def f(start_date, end_date): 
     some_code_here() 
     return series 
    return staticmethod(f) 

class TimeSeries(): 
    func1 = function_builder(some_data) 
    func2 = function_builder(some_other_data) 
    # ... 

staticmethod函數接受一個函數並返回它的一個靜態方法-y版本。因此,它也可以用作一個函數裝飾器。

如果您可以通過算法生成function_builder的輸入,那麼您可以(應該?)以編程方式生成時間序列函數。您可以使用__setattr__或更新__dict__將您的函數添加到子模塊(或此模塊中的對象,但這不是那麼優雅,恕我直言)。

0

我覺得你真的應該做的是將你的功能分成單獨的模塊如果你試圖防止名稱空間的污染。但是,你可以只使用一個SimpleNamespace

In [1]: def func1(a, b): 
    ...:  return a + b 
    ...: def func2(a, b, c): 
    ...:  return a*b*c 
    ...: def func3(x): 
    ...:  return 2**x 
    ...: 

In [2]: from types import SimpleNamespace 

In [3]: group1 = SimpleNamespace(func1=func1, func2=func2, func3=func3) 

現在你已經方便地組織你的名字,空格:

In [7]: group1.func1(1,2) 
Out[7]: 3 

In [8]: group1.func2(1, 2, 3) 
Out[8]: 6 

In [9]: group1.func3(8) 
Out[9]: 256 

雖然,他們仍然會模塊的命名空間下,如果你做一個簡單的import yourmodule。儘管SimpleNamespace基本上是一類,equivalent to the following

class SimpleNamespace: 
    def __init__(self, **kwargs): 
     self.__dict__.update(kwargs) 

    def __repr__(self): 
     keys = sorted(self.__dict__) 
     items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys) 
     return "{}({})".format(type(self).__name__, ", ".join(items)) 

    def __eq__(self, other): 
     return self.__dict__ == other.__dict__