2

私はPython2.7.2+を使用していますが、辞書が特定の文字列値(funcという名前)を保持しているかどうかを確認しようとすると、次の例外が発生します。

Traceback (most recent call last):
  File "Translator.py", line 125, in <module>
    elif type == Parser.C_ARITHMETIC : parseFunc()
  File "Translator.py", line 95, in parseFunc
    if unary.has_key(func) : 
AttributeError: 'function' object has no attribute 'has_key'

これは私が辞書を定義するところです:

binary = {"add":'+', "sub":'-', "and":'&', "or":'|'}
relational = {"eq":"JEQ" , "lt":"JLT", "gt":"JGT"}
unary = {"neg":'-'}

例外が発生する関数は次のとおりです。

def parseFunc():
    func = parser.arg1 
    print func  
    output.write("//pop to var1" + endLine)
    pop(var1)
    if unary.has_key(func) : // LINE 95
        unary()
        return
    output.write("//pop to var2" + endLine)
    pop(var2)
    result = "//"+func + endLine
    result += "@" + var1 + endLine
    result += "D=M" + endLine
    result += "@" + var2 + endLine
    output.write(result)
    if binary.has_key(func) : 
        binary()
    else : relational()

また、に変更if unary.has_key(func)してみましif func in unaryたが、

Traceback (most recent call last):
  File "Translator.py", line 126, in <module>
    elif type == Parser.C_ARITHMETIC : parseFunc()
  File "Translator.py", line 95, in parseFunc
    if func in unary:
TypeError: argument of type 'function' is not iterable

追伸私もPython3.2を使って疲れました

何か案は?ありがとう

4

2 に答える 2

5

Python 3でdict.has_key()はなくなりました(そしてかなり長い間非推奨になっています)。x in my_dict代わりに使用してください。

しかし、あなたの問題は別のものです。定義が示すunaryのは辞書である必要がありますが、トレースバックはそれが実際には関数であることを示しています。したがって、表示しなかったコードのどこかで、unaryが再定義されます。

そして、たとえunary辞書であったとしても、それを呼び出すことはできません。

于 2012-04-13T19:09:25.110 に答える
1

トレースから、単項の値を関数でオーバーライドしているようです(「単項」と呼ばれる関数はありますか?)。したがって、明らかにそのようなメソッドがない関数で「has_key」メソッドを呼び出そうとしています。変数名に注意してください。コード内で変数xがdefx()の後に配置されている場合、変数xはdef x()をオーバーライドします。その逆も同様です。

于 2012-04-13T19:16:40.487 に答える