0

クラス名のリストを文字列として持っています。print(cNames[0])それはFoo以来になりcNames[0] = "Foo"ます。クラス文字列とクラスを比較したい場合は、次のようにします。

if eval(cNames[0]) in classes:
    foo = eval(cNames[0])()

ただし、無効な構文エラーが表示されます。

  File ".\testing.py", line 54, in convert
    print("Class: %s" %eval(cNames[0]))
  File "<string>", line 1
    <class 'testing.Foo'>
    ^

SyntaxError: invalid syntax

クラス名だけを印刷していることはわかっていますが、if文でも機能しなかったので、印刷してみました。無効

編集:eval("<class 'testing.Foo'>")したがって、問題は私が代わりに 電話しているように見えましたeval("Foo")。これはいくつかの問題につながります。私は sqlite3 データベースで作業しており、次のように文字列を保存しようとして<class>:iFoo:53ます<class 'testing.Foo'>:53<class 'testing.Foo'>(文字列ではなく、クラス自体を) 文字列 "Foo" に変換するにはどうすればよいですか?

4

2 に答える 2

3

ここで起こっていることは、あなたがeval()2 回行っていることだと確信していcNames[0]ます。これは、クラスを印刷したときに得られる表現です。つまり、次のことを行っています。

eval("<class 'testing.Foo'>")

しかし、これは悪い方法です。名前からクラスへの辞書を保存し、それを使用します。これは、より明確で、信頼性が高く、安全で、高速な方法です (本当に必要な場合は、この辞書を生成できます)。

于 2012-10-14T10:44:33.893 に答える
2

クラスを含むリストがあると仮定すると、これを使用せずに非常にきれいに行うことができますeval

class Foo(object):
    pass

class Thing(object):
    pass

# List of interesting classes
classes = [Foo, Thing]

# Construct a dictionary where the key is the Classes __name__ attribute
classByNames = {cls.__name__:cls for cls in classes}

# Example usage
cName = 'Foo'
if cName in classByNames:
    inst = classByNames[cName]()
    print(inst) # <__main__.Foo object at ...>
else:
    print("Unknown class %s" % cName)

(上記は Python v2.7 でのみテストされていますが、v3 でも正常に動作するはずです)

于 2012-10-14T11:04:12.217 に答える