1

リストである定数、またはその他の変更可能なオブジェクトを持つことに関連する「落とし穴」のようなものはありますか?

現在、私のコンテキストは、呼び出しに渡される定数と関係がありますが、トピックが質問に意味のある影響を与えるとは思わないため、一般的に質問します。

次のコード例を検討してください。

#!/usr/bin/env python
# This file was not tested before posting.

import subprocess

LS_FLAGS = ['-l', '-a']

def main():
    subprocess.call(['ls'] + LS_FLAGS)

if __name__ == '__main__':
    main()

私がこれを尋ねるのは、関数定義の変更可能なオブジェクトから生じる問題を致命的に認識しているからです。そして、尊敬される定数への代入や突然変異を行うことは決してあってはならないことを私は理解しています。そして、その「定数」は実際には問題ではありません。私は尋ね、さらに尋ねます。偶発的な突然変異ではなく、意味的に自分自身を保護するためのいくつかの規則があるのでしょうか?

4

2 に答える 2

0

辞書のようなオブジェクトから「定数」にアクセスすることで、突然変異を防ぐことができます。その「ような」もの、おそらく:

class Config:
    _config = dict(
        LS_FLAGS=['-l', '-a']
    )
    def __getitem__(self, idx):
        return Config._config[idx].copy()  # Use copy.deepcopy 
                                           # instead if required

CONFIG=Config()

あるいは:

class Config:
    def __getitem__(self, idx):
        if idx == 'LS_FLAGS':
            return ['-l', '-a']

        raise KeyError(idx)

CONFIG=Config()

次に、次のCONFIGようにオブジェクトを使用します。

print(CONFIG['LS_FLAGS'])

これは完璧にはほど遠い (そしてあまり魅力的ではありません) が、これ により、「定数」が偶発的に破棄されるのを防ぐことができます。

# Try to mutate the constant config
ls_flags = CONFIG['LS_FLAGS']
ls_flags.append('/home')

print(CONFIG['LS_FLAGS']) # unchanged

CONFIG['LS_FLAGS'] = ['-ls']

上げますTypeError: 'Config' object does not support item assignment


¹もちろん、Python には「実際の」定数がないため、悪意のあるコードから保護することはできません。たとえば、CONFIGオブジェクトを完全に置き換えることができます...

于 2015-02-21T00:08:47.970 に答える