【问题标题】:How does the following code snippet work?以下代码片段如何工作?
【发布时间】:2026-01-24 03:15:01
【问题描述】:

我是 python 新手,我正在通过 Donour Sizemore 为 ELM327 开发一个名为 pyOBD 的开源项目(不太确定,可能针对更多扫描工具设备)。我可以看出以下是一种转换方法int 的十六进制值。但它是如何工作的?特别是里面有eval的那一行。

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

【问题讨论】:

  • 这是非常非常糟糕的代码。不要试图从中学习。
  • 也许你可以在codereview.stackexchange.com
  • 我真的畏缩了。我不经常畏缩代码。
  • 这应该是int(s, 16)(并且参数应该被称为str以外的其他名称)。
  • 这段代码不好的原因有很多:1)它覆盖了函数内部的str。 2) 空的{} 完全不做任何事情 3) eval 将运行您放入其中的任何代码(非常危险) 4) 只需执行 int(s, 16) 即可完成同样的事情,其中​​ s 是字符串 5) 如果你放入字符串以外的任何东西,它会爆炸。

标签: python eval obd-ii


【解决方案1】:

eval 像运行 Python 代码一样运行字符串,然后输出结果。

在这种情况下,它运行类似于0xaf 的东西,这是一种指定十六进制文字的方式,并输出结果整数。尝试在 Python 解释器中输入0xaf,你会得到一个整数作为结果。

eval 在不受信任的输入上使用是不安全的。例如,

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

可以删除系统上的文件。

最好使用ast.literal_evalint

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

哪些是安全的并且产生相同的结果。

【讨论】:

  • 哦,好吧..这确实回答了为什么代码是禁止的......但是十六进制值如何转换为整数值?
  • @JaneLove 因为 Python 将 0xaf 识别为有效的 Python 代码并运行它。尝试在 Python 解释器中输入它——你会得到一个整数作为输出。