Сценарии, которые полагаются на строки документации? - PullRequest
1 голос
/ 24 декабря 2011

Из 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.

Существуют ли случаи, когда удаление строк документации скрипта может логически нарушить некоторую зависимость или другой аспект функциональности кода, игнорируя какие-либо синтаксические ошибки?удаление комментариев нарушить справку?Похоже, что это не так в переводчике.

>>> 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.

Ответы [ 2 ]

3 голосов
/ 24 декабря 2011

Например, ply - это модуль, который выполняет лексирование и анализ, который использует строки документации для описания грамматики.Удаление строк документа нарушит код.

1 голос
/ 24 декабря 2011

Параметр -OO влияет только на то, хранится ли строка документа, но не влияет на синтаксический анализ.Например, следующий код работает с включенной оптимизацией и без нее:

def f():
    'Empty docstring'

assert f() is None

Программы, которые будут работать с включенной оптимизацией строки документа, - это программы, которые опираются на содержимое строки документа.Пол Ханкин упомянул Ply, инструмент, который использует строки документации для своей логики отправки.Другой пример - модуль doctest , который использует содержимое строк документации для тестов.

Вот простой пример кода, который не будет работать с включенной оптимизацией -OO:

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

print f()

Примечание help () по-прежнему будет работать с включенной оптимизацией -OO, но он найдет только имя функции, аргументы и модуль, но не строку документации:

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

f()
...