web-dev-qa-db-ja.com

誤って上書きしたビルトインを復元するにはどうすればよいですか?

インタラクティブなpythonセッション)で変数名として使用して誤ってsetを上書きしました-元のset関数にアクセスする方法はありますかセッションを再開せずに?

(そのセッションにはたくさんのものがあるので、そうする必要はありませんが、もちろん必要に応じてできます。)

27
weronika

組み込みをマスクしている名前を削除するだけです。

>>> set = 'oops'
>>> set
'oops'
>>> del set
>>> set
<type 'set'>

__builtins__名前空間を介していつでも元のビルトインにアクセスできます。組み込みをオーバーライドしたいが、オーバーライドから元の静止画に延期したい場合は、これを使用します。

>>> __builtins__.set
<type 'set'>

__builtins____builtin__モジュール (Python 2、sの欠如に注意)、または builtins module (Python 3、sあり、アンダースコアなし)。

マスキング名が定義されている場所を見つけるのに問題がある場合は、現在の名前空間から組み込みの名前空間までのすべての名前空間を確認してください。現在の状況に適用される可能性のあるスコープについては、 スコープルールの簡単な説明? を参照してください。

41
Martijn Pieters

__builtin__を使用できます:

>>> import __builtin__
>>> __builtin__.set
<type 'set'>

または単に(インポートは必要ありません):

>>> __builtins__.set
<type 'set'>

For Python

>>> import builtins
>>> builtins.set
<class 'set'>

から docs

CPython実装の詳細:ユーザーは__builtins__に触れないでください。厳密には実装の詳細です。 builtins名前空間の値をオーバーライドするユーザーは、__builtin__( ‘s’なし)モジュールをインポートし、その属性を適切に変更する必要があります。

6

組み込みラッパーを使用するには、最初にその元のアドレスXのような変数に割り当てます。

作業が完了したら、それをNoneに設定し、元のアドレスを組み込み関数に戻します。

  1. X= __builtin__.isinstance
  2. __builtin__.isinstance = myininstance
  3. 仕事は終わりました

    __builtin__.isinstance=None 
    
    __builtin__.isinstance=X 
    
0
Sagar