1

テキストで表現された任意の(データで定義された)ルールのセットをチェックしたいのですが、eval()はうまく機能します。

たとえば、AとBの両方が有効であることを確認するルールを定義します。

Rule = "A and B"
print eval(Rule)

では、どのようにして任意のアイテムのセットに動的に値を割り当てるのですか?

名前付きオプションのリストと選択のリストがあります。選択範囲内のすべてが有効(True)と見なされ、オプション内のすべてが無効(False)と見なされます。

したがって、このコードは機能しますが、ローカル名前空間内で値を設定していて、オプション名がローカル変数と衝突するのを防ぐことができないため、私はそれが好きではありません。

def CheckConstraints(self, Selections):
    'Validate the stored constraints'
    Good = True
    ## Undefined options default to False
    for i in self.Options:
        exec(i+" = False")  ## Bad - can I use setattr?
    ## Set defined Options to True
    for i in Selections:
        exec(i+" = True")  ## Bad - can I use setattr?
    for i in self.Constraints:
        if not eval( i ):
            Good = False
            print "Constraint Check Failure:", i, Selections
        else:
            print "Constraint Check OK:", i, Selections
    return Good

setattrを使用しようとしましたが、setattrが何を設定しているかが明確ではなく、evalは設定された値を使用できないようです。

私はPython2.7xを使用しています

何か提案を歓迎しますか?

4

1 に答える 1

1

eval新しい環境を含む2番目の引数として辞書を取ることができます。辞書envを作成し、そこに新しい変数を設定します。これにより、ローカルの名前空間と衝突しないようになります。

def CheckConstraints(self, Selections):
    'Validate the stored constraints'
    Good = True
    env = {}
    ## Undefined options default to False
    for i in self.Options:
        env[i] = False
    ## Set defined Options to True
    for i in Selections:
        env[i] = True
    for i in self.Constraints:
        if not eval(i, env):
            Good = False
            print "Constraint Check Failure:", i, Selections
        else:
            print "Constraint Check OK:", i, Selections
    return Good
于 2013-01-20T15:11:25.857 に答える