Форум сайта python.su
Мне нужно передавать параметры в функцию в виде кортежа:
например, Panthera = type('Panthera', (Pantherinae, Felidae), {'my_attr':123})
(Pantherinae, Felidae) - нужно передать, но Pantherinae, Felidae хранится у меня в виде строки, так как считывается из файла.
Как правильно передавать эти параметры в функцию?
помогите, пожалуйста)
Офлайн
Если нет опасений, касаемо содержимого файла (вредоносный код, например) то можно использовать eval()
А ещё можно поковырять модуль pickle.
Офлайн
Pantherinae, Felidae - это что? Строки?
Офлайн
EdЭто строка, считанная из текстового файла.
Pantherinae, Felidae - это что? Строки?
Офлайн
eval преобразует строку в выражение на питоне (по крайней мере так было в 2.5).
Например, eval((123, 456)) создаст кортеж (123, 456).
В вашем случае значения в файл нужно писать строкой, потом из файла выдирать и передавать в eval.
Petit-futeВНЕЗАПНО! Вы ведь не имя переменной хотите из текстового файла считать?..
Это строка, считанная из текстового файла.
Офлайн
Petit-futeНу, тогда ее нужно просто отпарсить.
Это строка, считанная из текстового файла.
input_line = 'Pantherinae, Felidae' # это ваша строка, считанная из файла
var1, var2 = input_line.split(', ') # после этого в var1 будет строка 'Pantherinae', а в var2 - 'Felidae'
Panthera = type('Panthera', (var1, var2), {'my_attr':123}) # передаем их в вашу странную конструкцию
я пробовала с eval - но не получилось, расскажите поподробнее подалуйстаeval - это зло. А в вашем случае я вообще не понимаю что человек имел в виду советуя его.
Офлайн
UsCrPantherinae, Felidae - вообще это имена родительских классов для класса Panthera. и мне надо динамически создать класс Panthera.
eval преобразует строку в выражение на питоне (по крайней мере так было в 2.5).
Например, eval((123, 456)) создаст кортеж (123, 456).
В вашем случае значения в файл нужно писать строкой, потом из файла выдирать и передавать в eval.Petit-futeВНЕЗАПНО! Вы ведь не имя переменной хотите из текстового файла считать?..
Это строка, считанная из текстового файла.
Офлайн
Edвсе дело в том, что var1, var2 - все равно остаются строками, а по идее в функции - это имена родительских классов. Причем их не обязательно два.Petit-futeНу, тогда ее нужно просто отпарсить.
Это строка, считанная из текстового файла.
Вот, например:input_line = 'Pantherinae, Felidae' # это ваша строка, считанная из файла
var1, var2 = input_line.split(', ') # после этого в var1 будет строка 'Pantherinae', а в var2 - 'Felidae'
Panthera = type('Panthera', (var1, var2), {'my_attr':123}) # передаем их в вашу странную конструкциюя пробовала с eval - но не получилось, расскажите поподробнее подалуйстаeval - это зло. А в вашем случае я вообще не понимаю что человек имел в виду советуя его.
Либо я не понял что вам нужно, а он понял :)
Офлайн
Petit-futeЯ поэтому и спросил строки ли это. Оказывается, что не строки, а имена классов.
все дело в том, что var1, var2 - все равно остаются строками, а по идее в функции - это имена родительских классов. Причем их не обязательно два.
input_line = 'Pantherinae, Felidae'
classes = tuple([globals()[name] for name in input_line.split(', ')])
Panthera = type('Panthera', classes, {'my_attr':123})
Отредактировано (Май 11, 2010 12:34:52)
Офлайн
Edспасибо, все заработало! :)Petit-futeЯ поэтому и спросил строки ли это. Оказывается, что не строки, а имена классов.
все дело в том, что var1, var2 - все равно остаются строками, а по идее в функции - это имена родительских классов. Причем их не обязательно два.
Это совсем другой случай. Тогда делаем так:PS: Классы должны быть видимы в текущем namespace по именам, то бишь либо определены здесь же, либо проимпортированы.input_line = 'Pantherinae, Felidae'
classes = tuple([globals()[name] for name in input_line.split(', ')])
Panthera = type('Panthera', classes, {'my_attr':123})
Офлайн