2.7

2017-08-12 12 views
0

だから私は、私は名前空間を防止するために、クラスに保存したい2.7

時系列として、約150かそこらの機能があり、この既存のコードベースに取り組んでいます汚染。

これは、これらの機能のそれぞれがどのようなパターンのないユニークな名前です

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) 

のようにそれを使用することができることにつながるということであった。しかし、このアプローチは、次のエラーがスローされます

はTypeError:バインドされていないメソッドf()が最初の引数として時系列インスタンスで呼び出さなければなりません(代わりに日付を得た)

どのように機能の巨大なコレクションを進めるべきかアドバイスしてください。私はプログラミングが初めてで、これを正しく実行したいと考えています。

+0

あなたが最初のクラスのインスタンスを作成せずにクラスメソッドを呼び出すようにしようとしているので、あなたが結合していないメソッドのエラーを取得しています。これらの機能が既に使用されている場合は、それらをすべてクラスに詰め込むことはおそらく解決策ではありません。 – rug3y

+0

これは本当にクラスの最高の使用ではありません。なぜ、それらを辞書や何かに入れないのはなぜですか? –

+0

Dictは悪い考えではありません。誰かがクラスをネームスペースとして使用できると私に言った前に、それを検討していました –

答えて

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__を使用して、サブモジュール(またはこのモジュールのオブジェクトですが、それほどエレガントではないIMHO)に関数を追加できます。

0

名前空間の汚染を防ぐために、別のモジュールに機能を分けてください。あなたは、簡単な操作を行う場合、彼らはまだ、モジュールの名前空間の下になります、が、

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 

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) 

そして今、あなたは、便利な自分の名前にスペースを組織しました:しかし、あなただけSimpleNamespaceを使用することができます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__