0

How to override python builtins with an import statementから、次のコードを取得しました。

from __future__ import print_function
def print(*args, **kwargs):
    .
    . some intervening logic
    .
    return __builtins__.print(*args, **kwargs)

このコードは問題なく動作しますが、モジュール スコープがあります。つまり、このファイル内に print ステートメントがある場合、それらは期待どおりに機能し、定義どおりに print() 関数を通過します。ただし、それを (foo import * から) インポートしても、それをインポートしたモジュール内では効果がありません。

印刷機能を「グローバルに」オーバーライドしたい場合、これをどのように行うのが最善ですか。理想的には:

from MyOverrides import *
.
.
.
class foo():
    .
    .
    def bar( self ):
        print( "this is my overridden print statement" )

ここでfuture、オーバーライド、および print()について何が欠けていますか?

私の環境は 2.6 以降ですが、3.0 ではありません。

4

2 に答える 2

1

future ステートメントをオンにするグローバル オーバーライドを使用することはできません (また、使用しないでください)。future ステートメントは Python ソース ファイルが解析およびコンパイルされる方法に影響を与えるため、Python がMyOverridesprint 関数を定義していることを知る前に、モジュールが使用するすべての future ステートメントは明示的でなければなりません。別のモジュールから future ステートメントをインポートすることはできません。

print 関数を置き換える最も安全な方法はfrom __future__ import print_function、すべてのモジュールで明示的に使用し、モジュールの 1 つから for の置換をインポートすることprintです。交換しないでください__builtin__.print

すべての出力を stdout に影響を与えたい場合は、print ステートメントまたは print 関数によって、どこでもsys.stdout、ラッパーに置き換えることができます。

import sys

stdout = sys.stdout

class new_stdout(object):
    def write(*args, **kwargs):
        # do whatever
        stdout.write(*args, **kwargs)

sys.stdout = new_stdout()

ただし、これはおそらく悪い考えであり、明示的なファイル引数を使用する print ステートメントや print 関数には影響しません。

于 2013-07-11T19:04:57.700 に答える
1

別のstackoverflowユーザーがほとんどの回答を提供しましたが、明らかに削除しました(?)。これが実用的なソリューションです。繰り返しますが、これが必ずしもベスト プラクティスであるとは限りませんが、特定の状況では便利な場合があります。

モジュール MyOverrides.py:

from __future__ import print_function
import __builtin__

builtin_print = __builtin__.print
def print(*args, **kwargs):
    .
    .... whatever code you need here
    .
    return builtin_print(*args, **kwargs)
__builtin__.print = print

モジュール test.py:

from __future__ import print_function
from MyOverrides import *
.
.
.

別のユーザーが指摘したように、将来の機能を使用する予定のすべてのモジュールで将来のインポートを行う必要があります。

回答したユーザー@kindallに感謝し、回答を撤回したようです。

于 2013-07-11T19:37:24.617 に答える