Найти - Пользователи
Полная версия: Преобразование float из строки в int
Начало » Python для новичков » Преобразование float из строки в int
1
w-keeper
Столкнулся с проблемой и знаний не хватает ее решить.
Допустим имеется следующий код (это не реальный код проекта а просто иллюстрация проблемы):

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’
И это понятно, но не понятно как поступить, чтобы преобразование все-таки было корректным.
Пока что вижу только один вариант - ловить эксепшен и проверять на выше приведенный кейс.

Что посоветуете?
s0rg
почему не сделать dst_data = 10.0 ?
w-keeper
В этом примере можно, но как я уже говорил 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)
Fibio
я не пойму какая у вас задача? преобразовать данные для конкатенации?
можно использовать eval, но смотря для каких целей вам это:
def some_function(src_data):
dst_data = 10
dst_type = type(dst_data)
return dst_data + dst_type(eval(src_data))
py.user.next
w-keeper
я передаю строку, содержащую вещественное число (например, “1.5”), то получаю эксепшен: ValueError: invalid literal for int() with base 10: ‘1.5’
>>> int(float("1.7"))
1
>>>
w-keeper
Fibio
я не пойму какая у вас задача? преобразовать данные для конкатенации?
Задача преобразовать данные к типу заданного атрибута класса, так, чтобы можно было провести операцию сложения. Для строки это будет конкатенация, для числовых типов - обычное сложение.

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

py.user.next
>>> int(float(“1.7”))
1
>>>
Это несомненно так :) Но мне нужно было динамическое определение и приведение.
Fibio
Eval, грубо говоря, воспринимает полученную строку как программный код, т.е. туда можно подать все что угодно. Я новичек и не знаю что туда можно подать но Лутц говорит: “достаточно грамотный пользователь мог бы подсунуть Вашей программе строку, которая при выполнении eval удалит все файлы на Вашем компе”
w-keeper
Fibio
Eval, грубо говоря, воспринимает полученную строку как программный код, т.е. туда можно подать все что угодно. Я новичек и не знаю что туда можно подать но Лутц говорит: “достаточно грамотный пользователь мог бы подсунуть Вашей программе строку, которая при выполнении eval удалит все файлы на Вашем компе”
Да, я об этом уже подумал, что безопасность при использовании eval() будет страдать. Правда к тому, что в него передается, пользователи прямого доступа не имеют, но кого это останавливало.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB