* open *という名前は、この例の組み込みスコープまたはグローバルスコープに属しますか?

yuanlu0210

このコードスニペットを検討してください。

global open
print(open)

これにより、次の結果が得られます。

<built-in function open>

私の質問は次のとおりです。名前をいオープンこの例では、内蔵またはグローバルスコープに属し?

グローバル宣言により、名前openがグローバルスコープにマップされるように強制される(したがって、エラーが発生する)と思いましたが、ここでは発生していません。どうして?

abarnert

まず、直接の答え:

名前openは最上位の名前空間に属しています。これは本質的に「グローバルで検索し、ビルトインにフォールバックし、グローバルに割り当てる」ことを意味します。

追加するglobal openだけで、それがすでに存在していた最上位の名前空間に属するように強制されます。(これは、関数やクラス内ではなく、最上位のコードであると想定しています。)

それはあなたが読んだものを縮小しているように見えますか?まあ、それはもう少し複雑です。


リファレンスドキュメントによると

このglobalステートメントは、現在のコードブロック全体を保持する宣言です。これは、リストされた識別子がグローバルとして解釈されることを意味します。


ただし、ドキュメントの他の部分が示唆しているように見えますが、「グローバルとして解釈される」とは、実際には「グローバル名前空間で検索される」という意味ではなく、「名前の解決」に記載されている「トップレベルの名前空間で検索される」という意味です。

名前は、グローバル名前空間、つまりコードブロックを含むモジュールの名前空間と、組み込みの名前空間であるモジュールの名前空間を検索することにより、最上位の名前空間で解決されますbuiltinsグローバル名前空間が最初に検索されます。名前がそこに見つからない場合は、builtins名前空間が検索されます。

また、「グローバルとして」とは、「グローバル名前空間内の名前が検索されるのと同じ方法」、別名「トップレベルの名前空間内」を意味します。

そしてもちろん、トップレベルの名前空間への割り当ては、ビルトインではなく、常にグローバルに行われます。(そのため、そもそもビルトインopenをグローバルopenシャドウイングできます。)


また、execevalドキュメントで説明されているように、これでさえ実行されたコードにはまったく当てはまらないことに注意しexecください。

グローバルディクショナリにキーの値が含まれていない場合、__builtins__組み込みモジュールのディクショナリへの参照がbuiltinsそのキーの下に挿入されます。そうすれば、__builtins__に渡す前に独自の辞書をグローバルに挿入することで、実行されたコードで使用できるビルトインを制御できますexec()

そしてexec、最終的には、モジュールとスクリプトがどのように実行されるかです。

したがって、実際に発生するのは、少なくともデフォルトでは、グローバル名前空間が検索されることです。名前が見つからない場合は、グローバル名前空間で__builtins__が検索されます。それがモジュールまたはマッピングの場合は、検索されます。


特にCPythonでこれがどのように機能するのか知りたい場合は、次のようにします。

  • コンパイル時:
    • コンパイラは関数のシンボルテーブルを作成し、名前をフリー変数(非ローカル)、セル変数(ネストされた関数によって非ローカルとして使用されるローカル)、ローカル(その他のローカル)、およびグローバル(もちろん技術的には「トップレベル」を意味します)に分けます。名前空間」変数)。ここでglobalステートメントが機能します。名前を別の名前ではなく、グローバルシンボルテーブルに強制的に追加します。
    • 次に、コードをコンパイルLOAD_GLOBALし、グローバル用の命令を発行します。(またco_names、グローバル変数やco_cellvarsセル変数など、コードオブジェクトのタプルメンバーにさまざまな名前を格納します。)
  • 実行時:
    • 関数オブジェクトがコンパイルされたコードから作成さ__globals__れると、属性としてアタッチされます。
    • 関数が呼び出されるとき、そのは__globals__なりf_globalsフレームのために。
    • 次に、インタプリタのevalループは、ドキュメントで説明されいるようにフォールバックを含め、それでLOAD_GLOBAL期待することを正確に実行することによって命令を処理しますf_globals__builtins__exec

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

document.openのこの関数はグローバルスコープになりますか?

分類Dev

untruncをコンパイルしようとすると、「エラー: 'avcodec_open'はこのスコープで宣言されませんでした」

分類Dev

$ mdMenuをスコープに注入します。未定義のプロパティopen()を読み取れません

分類Dev

Pythonでスラッシュをエスケープして、open()が自分のファイルを、読み取るファイルパスではなく、書き込むファイル名として認識するようにするにはどうすればよいですか?

分類Dev

Linuxはデバイスファイルをデバイスドライバーとどのようにリンクしますか?open()syscallは最終的にデバイスドライバーコードを呼び出しますか?

分類Dev

Linuxはデバイスファイルをデバイスドライバーとどのようにリンクしますか?open()syscallは最終的にデバイスドライバーコードを呼び出しますか?

分類Dev

コンパイルエラー:「structnet_device」には「open」という名前のメンバーがありません

分類Dev

open()メソッドが例外無視をスローした場合を想像してから、次のループに進みます

分類Dev

window.openを使用して新しいページに直接HTMLを書き込んでいるときに、ページの「読み込み」が完了したことをブラウザに知らせるにはどうすればよいですか?

分類Dev

Open Weather からのリソースの読み込みがブロックされました

分類Dev

Windows 10は、デフォルトのプログラムopenコマンドのレジストリ値に--- open-urlを追加します

分類Dev

phpmyadmin、neginxerror.log-グループwww-dataに読み取りアクセスとopen_basedirがあることを確認します

分類Dev

組み込み関数「open」がファイル名をエンコードおよびデコードするために使用するメカニズムは何ですか?

分類Dev

UbuntuのMicrosoftMachine LearningServerからインストールされたMicrosoftR Openをアップグレードするにはどうすればよいですか?

分類Dev

コードをarduinoにアップロードすると、次のエラーが発生します:「avrdude:ser_open():デバイスを開けません」/ dev / ttyACM0:アクセスが拒否されました」

分類Dev

Windows 7のOpen-WithgVimコンテキストメニューオプションはどこにありますか?

分類Dev

[列名]という名前の列は、フォームが再読み込みされたときにすでにこのDataTableに属しています。

分類Dev

Open Id Connect Doubts-Identity Server 4 //特定のユーザーに具体的なスコープを付与するにはどうすればよいですか?

分類Dev

Phantomjsは、page.openでのみ静的コンテンツをロードします

分類Dev

Phantomjsは、page.openでのみ静的コンテンツをロードします

分類Dev

コンソールアプリケーションからSQL接続を開こうとしています-conn.openが終了します

分類Dev

open()システムコールはカーネルモジュールに何を転送しますか?

分類Dev

SQLite open databaseはエラーコード14を返しますが、dbファイルがcpコマンドで作成された場合のみです。

分類Dev

リモートファイルシステムのopen()システムコールブロックはどうなりますか?

分類Dev

askopenfilename()の戻り値をパラメーターとして組み込みのPython関数openに渡す方法

分類Dev

C Python API Extensionsはopen(errors = "ignore")を無視し、とにかくエンコーディング例外をスローし続けます

分類Dev

関数をコンパイラのようなグローバルスコープにする組み込み

分類Dev

xhr.open()は特定のユーザー名とパスワードで何をしますか?

分類Dev

Open Erp 7で特定のグループのフィールドを読み取り専用にする方法は?

Related 関連記事

  1. 1

    document.openのこの関数はグローバルスコープになりますか?

  2. 2

    untruncをコンパイルしようとすると、「エラー: 'avcodec_open'はこのスコープで宣言されませんでした」

  3. 3

    $ mdMenuをスコープに注入します。未定義のプロパティopen()を読み取れません

  4. 4

    Pythonでスラッシュをエスケープして、open()が自分のファイルを、読み取るファイルパスではなく、書き込むファイル名として認識するようにするにはどうすればよいですか?

  5. 5

    Linuxはデバイスファイルをデバイスドライバーとどのようにリンクしますか?open()syscallは最終的にデバイスドライバーコードを呼び出しますか?

  6. 6

    Linuxはデバイスファイルをデバイスドライバーとどのようにリンクしますか?open()syscallは最終的にデバイスドライバーコードを呼び出しますか?

  7. 7

    コンパイルエラー:「structnet_device」には「open」という名前のメンバーがありません

  8. 8

    open()メソッドが例外無視をスローした場合を想像してから、次のループに進みます

  9. 9

    window.openを使用して新しいページに直接HTMLを書き込んでいるときに、ページの「読み込み」が完了したことをブラウザに知らせるにはどうすればよいですか?

  10. 10

    Open Weather からのリソースの読み込みがブロックされました

  11. 11

    Windows 10は、デフォルトのプログラムopenコマンドのレジストリ値に--- open-urlを追加します

  12. 12

    phpmyadmin、neginxerror.log-グループwww-dataに読み取りアクセスとopen_basedirがあることを確認します

  13. 13

    組み込み関数「open」がファイル名をエンコードおよびデコードするために使用するメカニズムは何ですか?

  14. 14

    UbuntuのMicrosoftMachine LearningServerからインストールされたMicrosoftR Openをアップグレードするにはどうすればよいですか?

  15. 15

    コードをarduinoにアップロードすると、次のエラーが発生します:「avrdude:ser_open():デバイスを開けません」/ dev / ttyACM0:アクセスが拒否されました」

  16. 16

    Windows 7のOpen-WithgVimコンテキストメニューオプションはどこにありますか?

  17. 17

    [列名]という名前の列は、フォームが再読み込みされたときにすでにこのDataTableに属しています。

  18. 18

    Open Id Connect Doubts-Identity Server 4 //特定のユーザーに具体的なスコープを付与するにはどうすればよいですか?

  19. 19

    Phantomjsは、page.openでのみ静的コンテンツをロードします

  20. 20

    Phantomjsは、page.openでのみ静的コンテンツをロードします

  21. 21

    コンソールアプリケーションからSQL接続を開こうとしています-conn.openが終了します

  22. 22

    open()システムコールはカーネルモジュールに何を転送しますか?

  23. 23

    SQLite open databaseはエラーコード14を返しますが、dbファイルがcpコマンドで作成された場合のみです。

  24. 24

    リモートファイルシステムのopen()システムコールブロックはどうなりますか?

  25. 25

    askopenfilename()の戻り値をパラメーターとして組み込みのPython関数openに渡す方法

  26. 26

    C Python API Extensionsはopen(errors = "ignore")を無視し、とにかくエンコーディング例外をスローし続けます

  27. 27

    関数をコンパイラのようなグローバルスコープにする組み込み

  28. 28

    xhr.open()は特定のユーザー名とパスワードで何をしますか?

  29. 29

    Open Erp 7で特定のグループのフィールドを読み取り専用にする方法は?

ホットタグ

アーカイブ