2016-05-31 11 views
2

ません。残念ながら、これは発生しません:Pythonのドキュメンテーション文字列が予期せずなし

print(Foo.__doc__) 
print(Foo().__doc__) 
print(Foo.bar.__doc__) 
print(Foo().bar.__doc__) 

出力None 4回。またNoneを印刷し

from functools import wraps 
def my_decorator(f): 
    @wraps(f) 
    def wrapper(*args, **kwds): 
     print('Calling decorated function') 
     return f(*args, **kwds) 
    return wrapper 

@my_decorator 
def example(): 
    """Docstring""" 
    print('Called example function') 
print(example.__doc__) 

:docstringのは私にとってNoneあるとして、ここで

https://docs.python.org/3.4/library/functools.html?highlight=doc#functools.wraps

また例では、失敗しているようです。

__doc__が指定された文字列に設定されていないのはなぜですか?

ideoneのsnipplet:http://ideone.com/cZNUQe

+0

Wow:私のローカルマシンでは、これらすべてが期待されるdocstringsを出力します( 'sys.version == '3.4.3+(デフォルト、Oct 14 2015、16:03:50)\ n [GCC 5.2.1 20151010]' ') – Herbert

+1

私のマシンで動作しますが、ideoneのバグかもしれません。 –

+0

また、最小限の例(==顧客生産コード)では、私のマシン上で '__doc__'が' None'と同じ動作をしていました。 – Herbert

答えて

2

更新:@user2357112's suggestionに基づいて、私は地元の通訳でideoneの動作を再現する方法を発見し、それはおそらく奇妙な矛盾の原因です。具体的には、ideoneはPython のラッパースクリプトをのフラグ-OOなしで実行していますが、the compile builtin functionを使用して、optimize=2のユーザー提供コードをコンパイルすると、結果のコンパイル済みコードオブジェクトevalが生成されます。これは前述の分割動作を引き起こすように見えます。 sys.flags.optimize0であり、__debug__True(外部インタープリタの状態に一致)ですが、docstringsとassert文は削除されます(compileが呼び出されたときの最適化レベルに一致します)。再現する

-OOフラグを渡すことなく、Pythonを使って次のスクリプトを実行します

source = '''import sys 
print(sys.flags) 
print("Debug:", __debug__) 
if __debug__: 
    print("Debug") 
else: 
    print("Non-debug") 
class Foo: 
    """abc""" 
print("Foo docstring:", Foo.__doc__) 
assert True == False 
''' 

compiled = compile(source, '<test>', 'exec', optimize=2) 
eval(compiled) 

出力である:

最初の2行は -OOなしで実行されているかのように振る舞う
sys.flags(debug=0, inspect=0, interactive=0, optimize=0, dont_write_bytecode=0, no_user_site=0, no_site=0, ignore_environment=0, verbose=0, bytes_warning=0, quiet=0, hash_randomization=1, isolated=0) 
Debug: True 
Non-debug 
Foo docstring: None 

、一方次の2行(およびAssertionErrorが存在しない)は、-OOが有効であるかのように動作します。実行中にsys.flagsのチェックが実行されている(つまり、メインインタプリタの状態を反映していることを意味します)、__debug__は半分です(if)。コンパイル時にその他の条件付きロジックが実行されます。 Trueとテストされていますが、Falseとテストされていますが、ドキュメントストリングとassertのストリッピングは完全に完了しています(したがって、それらはcompileoptimizeフラグの状態を反映します)。このような振る舞いは、あなたが(二重の最適化)-OOスイッチで実行している示すことになる、非ideoneの例について

:より頻繁に外ideoneを適用


古い答え。 -OO, docstrings are stripped during byte code compilation, replaced with Noneで実行すると、環境変数PYTHONOPTIMIZE2に設定すると同じ効果があります。

+1

しかし、 'optimize'フラグは0に設定されています。http://ideone.com/Zq9TdR – vaultah

+0

@vaultah:一方、故意にIdeoneに構文エラーを与えた場合、[traceback](http://ideone.com/BD67QR)通常のPython構文エラーではなく、 'py_compile'モジュールから来ています。これは、別々のコンパイルと実行のステップを実行しているようです。 'py_compile' [defaults](https://docs.python.org/3/library/py_compile.html)を使って、現在のインタプリタと同じ最適化レベルでコードをコンパイルします。 – user2357112

+0

私はIdeoneの人たちが、実行パスに '-OO'が指定されていなくても、コンパイルされたコードが' -OO'設定を継承することを意識することなく、コンパイルパスに対して '-OO'でPythonを走らせると考えます。 – user2357112

関連する問題