更新:@user2357112's suggestionに基づいて、私は地元の通訳でideoneの動作を再現する方法を発見し、それはおそらく奇妙な矛盾の原因です。具体的には、ideoneはPython のラッパースクリプトをのフラグ-OO
なしで実行していますが、the compile
builtin functionを使用して、optimize=2
のユーザー提供コードをコンパイルすると、結果のコンパイル済みコードオブジェクトeval
が生成されます。これは前述の分割動作を引き起こすように見えます。 sys.flags.optimize
は0
であり、__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
のストリッピングは完全に完了しています(したがって、それらはcompile
のoptimize
フラグの状態を反映します)。このような振る舞いは、あなたが(二重の最適化)-OO
スイッチで実行している示すことになる、非ideoneの例について
:より頻繁に外ideoneを適用
古い答え。 -OO
, docstrings are stripped during byte code compilation, replaced with None
で実行すると、環境変数PYTHONOPTIMIZE
を2
に設定すると同じ効果があります。
Wow:私のローカルマシンでは、これらすべてが期待されるdocstringsを出力します( 'sys.version == '3.4.3+(デフォルト、Oct 14 2015、16:03:50)\ n [GCC 5.2.1 20151010]' ') – Herbert
私のマシンで動作しますが、ideoneのバグかもしれません。 –
また、最小限の例(==顧客生産コード)では、私のマシン上で '__doc__'が' None'と同じ動作をしていました。 – Herbert