【问题标题】:Using strings as incomplete bits of code in Python在 Python 中使用字符串作为不完整的代码位
【发布时间】:2011-09-23 21:09:39
【问题描述】:

(请帮我澄清一下标题)

这是我想做的:

s = "'arg1', 'arg2', foo='bar', baz='qux'"
def m(*args, **kwargs):
  return args, kwargs

args, kwargs = m(magic(s))
# args = ['arg1', 'arg2']
# kwargs = {'foo': 'bar', 'baz'='qux'}

magic()的定义是什么?

自己解析字符串是最后的手段,因为它充满了陷阱(如果 arg1 有逗号怎么办?如果 arg2 有引号怎么办?等等)。

【问题讨论】:

  • 为什么要这样做?如果s来自用户,那么任何不那么复杂的方法都将充满安全风险。
  • @Karl s 来自配置文件。该文件的大部分内容根本不是 Pythonic,但我正在构建一些宏处理,这将受益于这种语法。

标签: python metaprogramming eval


【解决方案1】:

sm 定义为您拥有它们:

>>> args, kwargs = eval('m(%s)' % s)
>>> args
('arg1', 'arg2')
>>> kwargs
{'foo': 'bar', 'baz': 'qux'}

【讨论】:

    【解决方案2】:

    看看eval,但要注意,如果你不小心,可能会发生坏事。

    【讨论】:

    • Python 代码完全是源代码。编辑源代码的人可能会发生坏事。 eval() 没有更多的风险比 Python 已经固有的风险。
    • 另外一个不好的事情是,如果你不注意,你可以执行用户提供的代码。这与用户 I/O 使用 input 而不是 raw_input 的问题有关。
    • Python 代码完全是源代码。您可以随时执行用户提供的代码。 “注意”与此无关。 eval() 不是邪恶的。任何动态的解释性语言都是邪恶的。
    • 我从来没有说过 eval 是邪恶的。如果您接受来自当前执行程序之外的来源的输入,这些输入可能会变成 eval ,那么您就承担了额外的风险。假设来自程序外部的可执行输入与已知来源相同,可能会导致“坏事”,从次优性能到安全漏洞再到软件崩溃。所有程序在某种程度上都是完全源代码,所有允许执行任意源代码的程序都有严重的风险,不允许代码注入的程序不共享这些风险。
    • “所有程序在某种程度上都是完全源代码”。没错,但不是这里的重点。 .py 文件中的 Python 源代码和作为 eval 输入的 Python 源代码同样可疑。评估不是邪恶的。是的,它是崩溃的来源。但这并不是天生的坏事。
    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2019-05-02
    • 1970-01-01
    • 2019-06-08
    • 2016-11-05
    相关资源
    最近更新 更多