2016-11-28 3 views
-1

У меня есть несколько классов, импортированных в код, но мне нужно создать экземпляры только тех классов, которые указаны в текстовом файле. Так что у меня есть что-то вроде этогоPython: создать класс из строк в файле с аргументами

from module1 import c1 
from module2 import c2 
... 

и в текстовом файле у меня есть список только тех классов, которые я хочу, чтобы создать экземпляр как

c1() 
c2(True) 
... 

, поэтому я хочу, чтобы прочитать файл строки в списке (классы) и сделать что-то вроде

for i in classes: 
    classes_list.append(i) 

, так что каждый элемент списка является экземпляром класса. Я старался делать это на основе других решений я нашел здесь

for i in classes: 
    classes_list.append(globals()[i]) 

, но я всегда получаю эту ошибку

KeyError: 'c1()' 

или

KeyError: 'c2(True)' 

Любые идеи, как нечто подобное могло быть возможно?

+0

Есть ли причина, вы не хотите использовать [ ' pickle'] (HTTPS: //docs.p ython.org/3/library/pickle.html) вместо этого странного текстового формата? – Kevin

+0

Не совсем, все, что работает, прекрасно. Единственное требование состоит в том, чтобы список классов нужно было читать из текстового файла, так как другие люди будут определять, какие классы они хотят использовать, и я не знаю, какие из них они выберут. Также люди могли бы хотеть c2 с True или False как аргумент, и у меня также нет способа узнать – Atirag

+1

Насколько сложны эти строки? 'c2 (True)' okay Я могу иметь True/False. Могу ли я иметь несколько параметров? Целые? Как насчет математики (например, 'c2 (1 + 3)')? Здесь вы определяете мини-язык, и это может стать затруднительным. Вы можете сделать 'eval (line)' для каждой строки в файле, чтобы пользователь мог добавлять полные выражения python, например, вызывать несколько функций 'c2 (c1())'. – tdelaney

ответ

1

Вы реализуете мини-язык, который выражает способ вызова определенных функций. Это может стать затруднительным, но оказалось, что python уже реализует собственный мини-язык с помощью функции eval. С помощью eval python будет компилировать и выполнять выражения python.

Это считается рискованным для вещей, поступающих от анонимных и потенциально злонамеренных пользователей в сети, но может быть разумным решением для людей с определенным уровнем доверия. Например, если люди, пишущие эти файлы, находятся в вашей организации, и в любом случае вы можете столкнуться с вами тысячами способов, вы можете им доверять. Я реализовал систему, когда люди могли писать фрагменты тестового кода, и моя система все это обернула бы и превратила бы в тестовый набор. Нет проблем, потому что эти люди уже имели полный доступ к тестируемым системам.

module1.py

def c1(p=1): 
    return p 

def c2(p=1): 
    return p 

def c3(p=1): 
    return p 

test.py

import module1 

my_globals = { 
    'c1': module1.c1, 
    'c2': module1.c2, 
    'c3': module1.c3, 
} 

test = ["c1()", 
    "c2(p=c1())", 
    "c3('i am a string')", 
    "c1(100)"] 


for line in test: 
    print(line.strip() + ':', eval(line, my_globals)) 

результат

c1(): 1 
c2(p=c1()): 1 
c3('i am a string'): i am a string 
c1(100): 100 
Смежные вопросы