2016-08-30 31 views
0

私は設定ファイルを使用するPythonアプリケーションを作成していますので、設定ファイルの制御を専用モジュールconfigmanagerに委譲しています。 ConfigManager他のメソッドが呼び出されたときにPythonクラスが実行されるメソッド

ConfigManagerの方法が実行されると、設定ファイルが何らかの形で変更されるたびに、ディスクからファイルの最新バージョンを取得する必要があります。もちろん、DRYの精神では、configファイルのオープンをそれ自身の関数に委ねるべきです。

しかし、編集する各関数の設定ファイルを取得して返すメソッドを明示的に呼び出すのはあまり「クリーン」ではないようです。

メソッドが実行され、の前にのメソッドがそのクラスで実行されるときはいつでも、クラス内の他のメソッドで値を使用することを推奨しますか?言い換えれば

  • 私はConfigManager.edit_config()を作成します。

  • ConfigManager.edit_config()が呼び出されると、別の関数ConfigManager.get_config_file()が実行されます。

  • ConfigManager.get_config_file()は、方法ConfigManager.edit_config()に利用可能な値を作成します。

  • ConfigManager.edit_config()は、ConfigManager.get_config_file()で指定された値にアクセスできます。

私は私のコードを乾燥するので、願望、ConfigManageredit_config()方法の多くのバージョンを持っていることを期待しています。

このようなことを達成するための推奨方法はありますか?または、私はちょうど設定をうまく取得する関数を作成し、毎回手動で呼び出す必要がありますか?

+3

Uhm ... 'edit_config()'で 'self.get_config_file()'を呼びますか?明示的は暗黙的より優れています。これを明示的に行うことの問題は何ですか? – deceze

+0

私が言ったように、毎回手動で機能を実行するよりも良い方法があるように感じます。私は、Pythonが__init __()のような特別なクラスメソッドを持っている可能性があると考えました。それ以外の場合は、私は手動で行うことができます、私はちょうど他の可能性を探求したい。 – 99lives

+0

'get_config_file'を呼び出す必要がある多くのメソッドがありますか?それでは、あなたのコードを[DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)にしたいと思うかもしれませんが、 'edit_config'を呼び出すたびにそのメソッドを実行する必要がある場合は、暗黙的にも明示的にも違いがあります。 – deceze

答えて

2

持っている自然な方法は:

ConfigManager.get_config_file()は方法 ConfigManager.edit_config()に利用できる値になります。

get_config_file()返りその値を持つことです。

get_config_file()edit_config()と呼んでください。

edit_config()多くバージョンがあるように予定されている場合は、デコレータは、移動するための方法かもしれません:まず

、宣言:

def config_editor(func): 
    def wrapped(self, *args, **kwargs): 
     config_file = self.get_config_file() 
     func(self, config_file, *args, **kwargs) 
    return func 

class ConfigManager 
     . 
     . 
     . 
    @config_editor 
    def edit_config1(self, config_file, arg1): 
      ... 

    @config_editor 
    def edit_config2(self, config_file, arg1, arg2): 
      ... 

ConfigManager mgr 
mgr.edit_config1(arg1) 

私は実際にこのようにしないでくださいedit_config1の場合は、デコレータが追加の引数を提供するため、実際の使用ニーズよりも1つ多く引数をとります。上のすべてのその多くのボイラープレートを保存

第二に、それは実際にはしません:

結論
def edit_config3(self, arg1): 
     config_file = self.get_config_file() 

、私はデコレータはそれの価値があるのに十分な繰り返しを保存するとは思いません。

+0

これが可能であることは分かっています。 ConfigManagerで非常に多くのメソッドになる可能性のあるもので何度も同じ関数を何度も呼び出すのではなく、 – 99lives

+0

ああ!だからあなたの問題は、*多くの 'edit_config'関数があるということです。それを明確にするためにあなたの質問を編集する必要があります。 –

0

ディスクから何かを取得したので、ファイルを開きます。だから、あなたはwith "関数"のPythonのクラスを使うことができます。

コンテキストマネージャを確認する必要があります。これにより、誰かが__enter__メソッドを通じて設定ファイルにアクセスし、(必要な場合)__exit__メソッドでリソースを使用して停止する機能を実装するたびに、必要な機能を実装できます。

関連する問題