2012-01-25 5 views
1

私自身のLinuxディストリビューション用の設定プログラムを書いています。構成は、同様のオプションをグループ化するセクション:general, networking, session, etc.に分かれています。例えば。一般的なセクションではコンピュータname, description, workgroup, languageオプションがあります。Pythonでいくつかのアクションをグループ化するクラス

私はすべてのセクションがクラスによって提示されるべきだと思っており、各オプションは対応するプロパティ(getterとsetterかもしれません)を持たなければなりません。また

指定したオプションが有効になっているかどうかをテストする機能があった場合、それは一般化のためにいいだろう(つまり、システムは、このオプションのための要件を満たしている場合)、すなわち:私はこれらのオプションを必要とするよりは何ですか

class General(object): 

    @property 
    def name(self): 
     return self.get_computer_name() 

    @name.setter 
    def name(self, name): 
     self.set_computer_name(name) 

    def is_option_enabled(self, option): 
     return True_or_False 

(とセクションも)は、対応する翻訳された名前と説明(gettextを使用)とリンクしています。

クラス内のプレゼンテーションレイヤーをハードコーディングするのは良いことではないことを知っています... デザインパターン、一般的なアイデア/テンプレートなどが必要です。これを実装する方法は高品質で管理しやすくなります。

これらのクラス(text、gui、web)のフロントエンドをいくつか作成して、毎回同じコードを繰り返す必要はありません。

私は非常に懸命に考えていますが、残念ながら私はこれを行うか、いくつかの疑問を持っているかのアイデアを持っていない...

ありがとう:)

+0

[configparser](http://docs.python.org/py3k/library/configparser.html)の使用を検討しましたか? –

+0

本当に...何のために?しかし、JSON形式からこれらのオプションをインポートして適用/エクスポートするプログラムを作成します。 – marcinpz

+0

設定をファイルにインポート/エクスポートするには、最初に気になったことがあります.jsonは使用しませんでしたが、std-libでサポートされています。 –

答えて

1

を私はあなたのプロジェクトは非常に見えることを言うだろう野心的な

セクションごとにクラスを使用しても、基本的にセクションの追加、削除、変更にはコードの変更が必要となるため、動的ではなく、新しい前のバージョンと互換性がないバージョンです。

すべてのセクションが同じ方法で処理されるのが良いでしょう。

  1. そのようなファイルへのアクセス権を持つ保護された許容可能なセクションの宣言を持つファイルやオプション
  2. 設定ホルダー:私はあなたが必要だと思うコアの

    。お使いの設定ファイル用

  3. ローダー
    • 読む/あなたの設定ファイルを解析します。
    • コンフィギュレーションホルダを構築します。お使いのコンフィギュレーション・ホルダーへのアクセス権を持つ
  4. コマンド
    • 抽象BaseCommandこのアクセスを実現し、すべての実際のコマンドのための
    • サブクラス:GetAddRemove

その後のすべてのフロントエンドは、単にそれらのコマンドのインターフェースとなります。

+0

ありがとうございます。私はプラグイン可能なシステム[Yapsy](http://yapsy.sourceforge.net/)を作成することはかなり良いと思っていたと言わなければならない。プラグインマネージャーの設定ファイル(iniまたはJSON)を追加すると、特定のプラグインを有効/無効にすることができます。したがって、それぞれのアクションのためのコマンドとプラグインクラスを作成し、これらのプラグインを見つけて設定ファイルに従ってアクティブにする設定可能なPluginManagerを作成してください。それは良いだろうか? – marcinpz

+0

@marcinpz:このことをどうやって構築するかわからない場合は、より一般的な新しい質問を作成して指示を求めたいかもしれません。コードを作成する前に、実際にデザインを完成させる必要があります。とにかく、私は自分のシステム構成をプラガブルにすることはできないと思うが、フロントエンドだけだと、システムや他のアプリケーションの他の部分に引き渡すconf情報のサブセットもあるだろう。 –

+0

はいあなたは権利があります。 GUIのみがプラガブルでなければならず、いくつかの設定が存在するはずです。私はいくつかのこと全てがうまくいくはずですが、基本クラスの実装にはまだ問題があります。とにかくありがとう:) – marcinpz

1

あなたの設定では、ノードのセクションとリーフの設定オプションを持つツリーが構築されていると仮定します。あなたは、宣言APIを使用して、次のクラスとのネットワークのような2深さの深い形状を表すことができ、セットアップことを考えると

:宣言型APIのこの種は、metaclassesで達成される

class InterfaceConfiguration(Configuration): 
    mask = IPField() 
    dns = IPField() 
    IP = IPField() 
    dhcp = BooleanField() 
    driver = ChoiceField(choices=('madwifi', 'atheros', 'whatever')) 

class NetworkConfiguration(Configuration): 

    eth0 = InterfaceConfiguration(verbose_name='network interface eth0') 
    eth1 = InterfaceConfiguration(verbose_name='network interface eth1') 
    wlan0 = InterfaceConfiguration(verboxe_name='wireless network interface wlan0') 
    hostname = StringField() 
    domain = StringField() 

dictshieldを見ていると、このような特徴を実現するmanyORMsおよびmoreである。あなたは次のようにそれらを操作することができるだろうクラスのこの集合が与えられる

>>> configuration = NetworkConfiguration('/path/to/config/file') 
>>> configuration.eth0.verbose_name 
'network interface eth0' 
>>> configuration.eth0.mask.set('192.168.0.255') 
True 
>>> configuration.eth0.driver.choices 
('madwifi', 'atheros', 'whatever') 
>>> configuration.hostname.set('amokrane') 
>>> configuration.domain.set('imazighen') 
>>> configuration.wlan0.dhcp.get_value() 
True 

APIのこの種のは、実装が簡単で、具体的なPythonの構築(下記参照)を必要とする能力を提供していません。 getとset以外にも他のメソッドを持つこと。

get/setの他に、python記述子を使用してさまざまな種類のフィールドを実装する必要がない場合は、件名についてPython attributes and methodsという記事を読んで、PythonのORMに関する詳細なリンクと上記のリンクをお勧めしますそれは使用された方法であるからです。

+0

私はあなたの考えが好きですが、私はこれらの値をシステムから読み書きする必要があります。例えば、NetworkConfigurationは/ etc/network/interfacesファイル(Ubuntuで)からインタフェースを読み書きすることができます。単純にConfigurationに読み書きメソッドを書いて、すべてのサブクラスでそれらを再実装するかどうか分かりません。 2番目はホスト名が別のファイルに保存されているため、NetworkConfigurationクラスに属している必要があるかどうかわかりません... – marcinpz

+0

1)ネットワーク構成の例を取り上げて、ネットワーク構成のあらゆる側面を制御し、実装されました。あなたが実装する必要がある複雑な設定を記述する結果としての例を更新する – amirouche

+0

書き込み/読み込みは、イントロスペクションを介してベースクラスによって処理されるので、新しい設定ファイルを実装するための新しいコードを書くことは決してありません。しかし、新しいフィールドタイプをサポートしたい場合は、新しいコードを書くことができます。 – amirouche

関連する問題