2

print 関数のようなグローバル関数を Python 3.3 で作成しようとしています。特に、独自のアプリケーションに python を埋め込んでおり、任意のスクリプトで使用できる単純な「debug(value)」グローバル関数を公開したいと考えています。関数をモジュールにアタッチすることでこれを行うことは可能ですが、便宜上、'print(value)' のようにグローバルにする方が簡単です。

インポートなしで任意の python ファイルで使用できるようになるグローバル関数をどのように宣言しますか、またはこれは python のブラックボックスですか? C側バインディングからできますか?

4

1 に答える 1

4

ほとんどの場合、これは悪い考えですが、本当にやりたい場合は…</p>

関数を印刷するか調べると、それprintが module にあることがわかりますbuiltins。それがあなたの手がかりです。したがって、これを行うことができます:

debugmodule.py:

import builtins
builtins.debug = debug

これで、 の後、import debugmodule他のモジュールは のdebug代わりに呼び出すことができdebugmodule.debugます。


C側バインディングからできますか?

CPython では、C 拡張モジュールは基本的に純粋な Python モジュールと同じことを行うことができます。または、もっと単純に、_debugmodule.soC で 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 debugmodulefrom debugmodule import debug他のすべてのモジュールで。そうすれば、それを必要とするすべてのモジュールでモジュールレベルのグローバルになります。

于 2013-04-02T18:24:10.377 に答える