【问题标题】:Scripts that Rely on Docstrings?依赖文档字符串的脚本?
【发布时间】:2012-01-27 09:23:48
【问题描述】:

来自 2.7.2 文档,第 6 节,Modules

Passing two -O flags to the Python interpreter (-OO) will cause the bytecode compiler to perform optimizations that could in some rare cases result in malfunctioning programs. Currently only __doc__ strings are removed from the bytecode, resulting in more compact .pyo files.

这引起了我的注意:

Since some programs may rely on having these available, you should only use this option if you know what you’re doing.

在任何情况下,删除脚本的文档字符串可能会在逻辑上破坏代码功能的某些依赖关系或其他方面,而忽略任何语法错误?

编辑

为什么删除 cmets 会破坏帮助语句?在解释器中似乎没有这样做。

>>> help('import_pi')

Help on module import_pi:

NAME
    import_pi

FILE
    /home/droogans/py/import_pi.py

FUNCTIONS
    print_pi()

DATA
    pi = 3.1415926535897931


>>> import import_pi()
>>> import_pi.__doc__
>>>
>>> print import_pi.print_pi.__doc__
Convert a string or number to a floating point number, if possible.

【问题讨论】:

  • 从脚本中删除文档字符串的部分除外。还是我误读了这两种情况?
  • 哦,我明白你在说什么。是的,不,-OO 将其从字节码中删除。它不会更改您的 .py 文件,您是正确的。我只是将两者联系起来,因为这是与我的主题相关的少数几个问题之一。我通常会写出导致我提出问题的原因,以及让我到达那里的想法,因为第一条评论几乎总是这样:more info please

标签: python compiler-optimization removing-whitespace docstring


【解决方案1】:

例如ply 是一个进行词法分析和解析的模块,它使用文档字符串来描述语法。剥离文档字符串会破坏代码。

【讨论】:

  • +1 The PLY parser 遵循与词法分析器类似的约定,为每个 BNF 规则创建一个带有前缀 p_ 的函数,其文档字符串包含我们要匹配的 BNF 规则(仅将 ::= 替换为 :)
【解决方案2】:

-OO 选项只影响文档字符串是否被存储——它不影响解析。例如,以下代码在启用和不启用优化的情况下均有效:

def f():
    'Empty docstring'

assert f() is None

会因启用文档字符串优化而中断的程序是依赖文档字符串的内容的程序。 Paul Hankin 提到了 Ply,它是使用文档字符串作为其调度逻辑的工具。另一个例子是doctest module,它使用文档字符串的内容进行测试。

这是一个在启用-OO 优化时不起作用的简单代码示例:

def f():
    '30 + 40'
    return eval(f.__doc__)

print f()

注意 help() 仍然可以在启用 -OO 优化的情况下工作,但它只会找到函数名、参数和模块,而不是文档字符串:

>>> help(f)
Help on function f in module __main__:

f()

【讨论】:

  • 在此处模拟您的会话显示了f() 的帮助,文档字符串30 + 40 在它自己的行上标记了一次,打印在函数名称下方。我正在使用 python 2.6。
  • 我收回我之前的声明。您假设help(f) 的显示发生在.pyo 文件上。道歉。
猜你喜欢
  • 2019-07-23
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多