Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 2, 2011 18:33:18

w-keeper
От:
Зарегистрирован: 2011-10-02
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Преобразование float из строки в int

Столкнулся с проблемой и знаний не хватает ее решить.
Допустим имеется следующий код (это не реальный код проекта а просто иллюстрация проблемы):

def some_function(src_data):
dst_data = 10
dst_type = type(dst_data)
return dst_data + (dst_type)(src_data)
При этом src_data - всегда строка, а вот dst_data может быть любого типа, в данном случае это int.
Так вот, если dst_data - int, а в качестве src_data я передаю строку, содержащую вещественное число (например, “1.5”), то получаю эксепшен: ValueError: invalid literal for int() with base 10: ‘1.5’
И это понятно, но не понятно как поступить, чтобы преобразование все-таки было корректным.
Пока что вижу только один вариант - ловить эксепшен и проверять на выше приведенный кейс.

Что посоветуете?



Офлайн

#2 Окт. 2, 2011 18:46:08

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Преобразование float из строки в int

почему не сделать dst_data = 10.0 ?

Офлайн

#3 Окт. 2, 2011 18:57:17

w-keeper
От:
Зарегистрирован: 2011-10-02
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Преобразование float из строки в int

В этом примере можно, но как я уже говорил 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)

Офлайн

#4 Окт. 2, 2011 20:46:14

Fibio
От:
Зарегистрирован: 2010-09-14
Сообщения: 74
Репутация: +  2  -
Профиль   Отправить e-mail  

Преобразование float из строки в int

я не пойму какая у вас задача? преобразовать данные для конкатенации?
можно использовать 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)

Офлайн

#5 Окт. 3, 2011 01:39:41

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9740
Репутация: +  843  -
Профиль   Отправить e-mail  

Преобразование float из строки в int

w-keeper
я передаю строку, содержащую вещественное число (например, “1.5”), то получаю эксепшен: ValueError: invalid literal for int() with base 10: ‘1.5’
>>> int(float("1.7"))
1
>>>



Офлайн

#6 Окт. 3, 2011 07:31:07

w-keeper
От:
Зарегистрирован: 2011-10-02
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Преобразование float из строки в int

Fibio
я не пойму какая у вас задача? преобразовать данные для конкатенации?
Задача преобразовать данные к типу заданного атрибута класса, так, чтобы можно было провести операцию сложения. Для строки это будет конкатенация, для числовых типов - обычное сложение.

Fibio
можно использовать eval, но смотря для каких целей вам это
Да, такое решение отлично подходит, это именно то, что было нужно - корректное определение числового типа в строке. Спасибо!

py.user.next
>>> int(float(“1.7”))
1
>>>
Это несомненно так :) Но мне нужно было динамическое определение и приведение.



Офлайн

#7 Окт. 3, 2011 09:42:41

Fibio
От:
Зарегистрирован: 2010-09-14
Сообщения: 74
Репутация: +  2  -
Профиль   Отправить e-mail  

Преобразование float из строки в int

Eval, грубо говоря, воспринимает полученную строку как программный код, т.е. туда можно подать все что угодно. Я новичек и не знаю что туда можно подать но Лутц говорит: “достаточно грамотный пользователь мог бы подсунуть Вашей программе строку, которая при выполнении eval удалит все файлы на Вашем компе”



Офлайн

#8 Окт. 3, 2011 16:20:23

w-keeper
От:
Зарегистрирован: 2011-10-02
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Преобразование float из строки в int

Fibio
Eval, грубо говоря, воспринимает полученную строку как программный код, т.е. туда можно подать все что угодно. Я новичек и не знаю что туда можно подать но Лутц говорит: “достаточно грамотный пользователь мог бы подсунуть Вашей программе строку, которая при выполнении eval удалит все файлы на Вашем компе”
Да, я об этом уже подумал, что безопасность при использовании eval() будет страдать. Правда к тому, что в него передается, пользователи прямого доступа не имеют, но кого это останавливало.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version