2013-08-23 2 views
1

Я новичок в python и просматриваю проект с открытым исходным кодом под названием pyOBD by Donour Sizemore для ELM327 (не совсем уверен, может быть нацелен на большее количество устройств scantool). Я могу понять, что следующий метод - это метод преобразования hex значение int. Но как это работает? Специально линия с eval в ней.Как работает следующий фрагмент кода?

def hex_to_int(str): 
    i = eval("0x" + str, {}, {}) 
    return i 
+7

Это очень, очень плохой код. Не пытайтесь учиться на этом. –

+0

Возможно, вы можете задать вопрос по адресу http://codereview.stackexchange.com –

+1

Я на самом деле съежился. Я часто не сжимаю код. – roippi

ответ

4

eval запускает строку, как если бы это был код Python, а затем выводит результат.

В этом случае он запускает что-то вроде 0xaf, что является способом указания шестнадцатеричного литерала и выводит итоговое целое число. Попробуйте ввести 0xaf в интерпретатор Python, и вы получите целое число в качестве результата.

eval небезопасно использовать на ненадежном вводе. Например,

eval("0xa and __import__('os').remove('some/file/path')") 

может удалить файл в вашей системе.

Было бы лучше использовать ast.literal_eval или int:

>>> import ast 
>>> ast.literal_eval("0xaf") 
175 
>>> int("af", 16) 
175 

, которые являются безопасными и тот же результат.

+0

О, хорошо ... Это ответ на вопрос, почему код не-нет ... но как шестнадцатеричное значение преобразуется в целочисленное значение? –

+1

@JaneLove Поскольку Python распознает '0xaf' как действительный код Python и запускает его. Попробуйте ввести это в интерпретатор Python - вы получите целое число как результат. – agf