1

リストから 1000 以上のクラスを生成する必要があります。

1) 私の場合、私のリストはユーザー指定ではありません。コンテンツは信頼できます。リスト コンテンツは自分で作成します。したがって、セキュリティ リスクを導入することなく eval() を使用できます。ただし、 entry = eval(c_class)() を実行する代替方法があるかどうかを知りたい

2) エントリ変数を再利用する代わりに、class_list_names から変数名を作成したいと考えています。すなわち: rak_entry = rak() ... bak_entry = bak() .

exec("entry_"+c_class +" = eval(c_class)()")

eval で exec を使用する以外の方法はありますか?

これが私のコードです

class_list_names = ['rak', 'bak', 'sak', 'mak']

class pattern_class(object):
    generic_attr = "bla"

def declare(classname):
    globals()[classname] = type(classname, (pattern_class,), {'__tablename__' : classname+"_daily_history"})

for c_class in class_list_names:
    declare(c_class)
    entry = eval(c_class)()
    print(entry)
    print(entry.__tablename__)
    print(entry.generic_attr)

出力

<__main__.rak object at 0x0242D950>
rak_daily_history
bla
<__main__.bak object at 0x0242DA10>
bak_daily_history
bla
<__main__.sak object at 0x0242D9B0>
sak_daily_history
bla
<__main__.mak object at 0x0242D950>
mak_daily_history
bla

よろしく

4

1 に答える 1

0

生成declareされたクラスを返すようにします。

class pattern_class(object):
    generic_attr = "bla"

def declare(classname):
    return type(classname, (pattern_class,), {'__tablename__' : classname+"_daily_history"})

class_list_names = ['rak', 'bak', 'sak', 'mak']
for name in class_list_names:
    cls = declare(name)
    globals()[name + '_entry'] = cls()

print rak_entry.__tablename__, bak_entry.__tablename__, sak_entry.__tablename__, mak_entry.__tablename__
于 2013-09-15T07:02:34.223 に答える