ほとんどの場合、これは悪い考えですが、本当にやりたい場合は…</p>
関数を印刷するか調べると、それprint
が module にあることがわかりますbuiltins
。それがあなたの手がかりです。したがって、これを行うことができます:
debugmodule.py:
import builtins
builtins.debug = debug
これで、 の後、import debugmodule
他のモジュールは のdebug
代わりに呼び出すことができdebugmodule.debug
ます。
C側バインディングからできますか?
CPython では、C 拡張モジュールは基本的に純粋な Python モジュールと同じことを行うことができます。または、もっと単純に、_debugmodule.so
C で a を書き、それdebugmodule.py
をインポートして にコピーdebug
するa を書きbuiltins
ます。
CPython を埋め込む場合はbuiltins
、スクリプト/インタラクティブ シェルなどを開始する前に、または後でいつでも関数をモジュールに挿入するだけでこれを行うことができます。
これは確実に機能しますが、実際に機能することが保証されているかどうかは完全には明らかではありません。docsを読むと、次のように書かれています。
実装の詳細として、ほとんどのモジュールは__builtins__
そのグローバルの一部として利用できる名前を持っています。の値__builtins__
は通常、このモジュールまたはこのモジュールの__dict__
属性の値です。これは実装の詳細であるため、Python の代替実装では使用されない場合があります。
そして、少なくとも CPython では、実際には、モジュール__builtins__
ではなく、ルックアップ チェーンの一部として検索されるモジュールまたは辞書builtins
です。そのため、別の実装が CPython のように で物事を検索できる可能性がありますが__builtins__
、同時に でbuiltins
(またはそれに対するユーザーの変更を) 自動的に使用可能にしない可能性があります__builtins__
。その場合、これは機能しません。(CPython はこれまでのところ利用可能な 3.x 実装のみであるため、推測するのは困難です…)
これが将来の Python 3.x 実装でうまくいかない場合、私が考えることができる唯一のオプションは、組み込み関数ではなく、各モジュールに関数を注入することです。これは、 PEP-302インポート フックを使用して行うことができます(これは、PEP 302 が作成されたときよりも 3.3 の方がはるかに簡単です。詳細については、インポート システムを参照してください)。
2.x では、builtins
自動的に物を魔法のモジュールに注入するモジュールの代わりに、魔法__builtins__
のモジュールだけがあります__builtin__
(欠落していることに注意してs
ください)。あなたはそれをするimport
必要があるかもしれませんし、そうでないかもしれません(安全のためにそうするかもしれません). また、変更できる場合とできない場合があります。しかし、(少なくとも) CPython と PyPy では動作します。
それで、それを行う正しい方法は何ですか?シンプル: の代わりにimport debugmodule
、from debugmodule import debug
他のすべてのモジュールで。そうすれば、それを必要とするすべてのモジュールでモジュールレベルのグローバルになります。