Форум сайта python.su
Столкнулся с проблемой и знаний не хватает ее решить.
Допустим имеется следующий код (это не реальный код проекта а просто иллюстрация проблемы):
def some_function(src_data):
dst_data = 10
dst_type = type(dst_data)
return dst_data + (dst_type)(src_data)
Офлайн
почему не сделать dst_data = 10.0 ?
Офлайн
В этом примере можно, но как я уже говорил dst_data может оказаться любого типа т.к. в проекте это атрибут класса.
Вижу, что такой пример вызывает подобные вопросы, поэтому вот код более приближенный к реальности:
def some_func(self, dst_param, src_value):
if not hasattr(self, dst_param): return
src_value = type(getattr(self, dst_param))(src_value)
curr_dst_value = getattr(self, dst_param)
setattr(self, dst_param, curr_dst_value + src_value)
Отредактировано (Окт. 2, 2011 18:59:44)
Офлайн
я не пойму какая у вас задача? преобразовать данные для конкатенации?
можно использовать eval, но смотря для каких целей вам это:
def some_function(src_data):
dst_data = 10
dst_type = type(dst_data)
return dst_data + dst_type(eval(src_data))
Отредактировано (Окт. 2, 2011 20:54:07)
Офлайн
w-keeper
я передаю строку, содержащую вещественное число (например, “1.5”), то получаю эксепшен: ValueError: invalid literal for int() with base 10: ‘1.5’
>>> int(float("1.7"))
1
>>>
Офлайн
FibioЗадача преобразовать данные к типу заданного атрибута класса, так, чтобы можно было провести операцию сложения. Для строки это будет конкатенация, для числовых типов - обычное сложение.
я не пойму какая у вас задача? преобразовать данные для конкатенации?
FibioДа, такое решение отлично подходит, это именно то, что было нужно - корректное определение числового типа в строке. Спасибо!
можно использовать eval, но смотря для каких целей вам это
py.user.nextЭто несомненно так :) Но мне нужно было динамическое определение и приведение.
>>> int(float(“1.7”))
1
>>>
Офлайн
Eval, грубо говоря, воспринимает полученную строку как программный код, т.е. туда можно подать все что угодно. Я новичек и не знаю что туда можно подать но Лутц говорит: “достаточно грамотный пользователь мог бы подсунуть Вашей программе строку, которая при выполнении eval удалит все файлы на Вашем компе”
Офлайн
FibioДа, я об этом уже подумал, что безопасность при использовании eval() будет страдать. Правда к тому, что в него передается, пользователи прямого доступа не имеют, но кого это останавливало.
Eval, грубо говоря, воспринимает полученную строку как программный код, т.е. туда можно подать все что угодно. Я новичек и не знаю что туда можно подать но Лутц говорит: “достаточно грамотный пользователь мог бы подсунуть Вашей программе строку, которая при выполнении eval удалит все файлы на Вашем компе”
Офлайн