1

dict慣習として、次のように「オプション」クラスの助けを借りてPythonで構成の構築をサポートできると誰かが私に提案しました:

...
config = {Options.A: 10, Options.B: 20} # produces config = {"A": 10, "B": 20}
result = myObj.someMethod(value, config)
...

ここでのアイデアは、ユーザーが最初から構成を構築することに頼るのではなく、クライアントユーザーが選択できるオプションのメニューを提供するdictことです-1つの利点は、構成フィールドのタイプミスをなくすことであり、おそらくそれが役立つと思います前方互換性あり。

これをサポートするために考えられる唯一の方法は、次のOptionsようなクラスを実装することです。

class Options:
    A = "A"
    B = "B"

しかし、これは多くの点で気分が悪いです。ユーザー コードがオプション クラスのフィールド (例: Options.A="garbage") のいずれかを上書きすると壊れてしまうため、脆弱です。とにかく、これらのフィールドを実装するのは、A = "A"ばかげているように感じます。dictさらに、Options クラスを実装する場合、Options クラスを使用して?を生成する代わりに、Options オブジェクトを直接使用するべきではありません。

config = {Options.A: 10, Options.B: 20}では、目的のパターンを実装するためのよりエレガントで効果的な方法、または同様のものはありますか? このパターンはおなじみですか?

編集:これが明確でない場合、config dict には利用可能なオプションの小さなサブセットのみを含める必要があります。

4

2 に答える 2

1

この構成の目的を理解しているかどうかはわかりません。ユーザーが config に有効なキーのみを使用するようにしたい場合は、属性をデコレータdictで保護します( http://docs.python.org/2/library/functions.html#propertyを参照):property

class Options:
    def __init__(self):
        self._A = 'A'
        self._B = 'B'
        # etc.

    @property
    def A(self):
        return self._A

    @property
    def B(self):
        return self._B

    # etc.

ユーザーがクラスを台無しにするのを完全に防ぐわけではありませんが、少なくともそうするのは簡単ではありません。

于 2013-07-09T12:08:11.727 に答える
1

意図した目的や期待されるメリットを理解することはできませんが、辞書を作成して検証するためのヘルパーを探している場合は、次のようなものが良い出発点になる可能性があります。

def config(**kwargs):
    for key, value in kwargs.items():
        if key not in AllowedKeys:
            raise KeyError("{} is not allowed in config".format(key))

        if not value_is_correct_for_key(key, value):
            raise ValueError("{} is not allowed for {} in config".format(value, key))

        # ... more tests here depending on your use case

    # Everything is OK,  just return the dictionary
    return kwargs



# Usage:
print(config(A="1", B="2"))
于 2013-07-09T12:40:58.497 に答える