2017-05-19 9 views
0

私はPython 3.6でArghを使用して複雑なコマンドライン関数を作成していますが、深い設定ファイルのために関数の引数のデフォルト値を取得すると長い文字列の辞書キーが必要になります。関数の引数でスーパーロングディクショナリクリーナーを書くには?

これは、別の辞書のキーとして辞書の値があるため、特に読みやすいようには見えません。これは よりもさらに入れ子になる可能性があります。

このようなデフォルトの値でさらに引数がある可能性があるので、これを維持するとすぐにさらに混乱することになります。これはほんの一デフォルトの引数であり、例:

import argh 
import config 

@arg('-v', '--version') 
def generate(
    kind, 
    version=config.template[config.data['default']['template']]['default']['version']): 
    return ['RETURN.', kind, version] 

バージョンの引数のデフォルト値はリストと辞書の形式で大量のデータを生成し、私のコンフィグモジュールから取得されます。 試してみて、より良いデフォルト値を説明するために:あなたは、これは読みやすく保つために

config.template[ # dictionary containing variables for a particular template 
    config.data['default']['template'] # the default template name set in the main configuration 
]['default']['version'] # The default version variable within that particular template 

何をお勧めですか?

+1

はおそらく、あなたが[easydict](https://pypi.python.org/pypi/easydict/)のようなものを探していますか[ treedict](http://www.stat.washington.edu/~hoytak/code/treedict/overview.html)(または同じアイデアの無数のバリエーション)? – drdaeman

答えて

1

私は、変更可能なデフォルト値に同じトリックを使用しています。これにより、より読みやすいものを書く余地が広がります。

@arg('-v', '--version') 
def generate(kind, version=None): 
    if version is None: 
     d = config.data['default']['template'] 
     version = config.template[d]['default']['version'] 
    return ['RETURN.', kind, version] 

一つの欠点は、config.data(またはdictsのいずれか)のデータが関数が定義されている場合、それが実行されるときとの間に変更することができ、これは、techinically異なることです。関数を定義する前にdict参照を一度行うことができます。

# Choose whatever refactoring looks good to you 
default_template = config.data['default']['template'] 
default_version = config.template[default_template]['default']['version'] 

@arg('-v', '--version') 
def generate(kind, version=default_version): 
    return ['RETURN.', kind, version] 

del default_template default_version # Optional 
+0

私は_addict_ Pythonライブラリを見つけ出しましたが、関数に応じてこれらのリファクタリングのどちらかまたは両方を適用することを検討します。 –

1

なぜ1行にそれを行う:

default_template_id = config.data['default']['template'] 
default_template = config.template[default_template_id] 
default_version = default_template['default']['version'] 

def generate(kind, version=default_version): 
    return ['RETURN.', kind, version] 
関連する問題