2017-09-17 5 views
3

誤ってdictというキーワードに辞書を割り当てましたが、現在はdict object not callableになっています。カーネルを再起動せずに機能を再割り当てするにはどうすればよいですか?dict機能を 'dict'に再割り当てする方法はありますか?

+1

'del dict'は動作するはずですか? – ayhan

+0

ええと...これは詐欺師です(あなたが尋ねたので)。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅあなたは本当に重複を見つけることができます。 :-) – Dark

答えて

3

dictは組み込みです。 ビルトインはbuiltinパッケージにまとめられています。だから、使用することができます。

import builtins 
dict = builtins.dict 

アドバイスの作品はにある組み込みコマンドをオーバーライドすることはありません:、言われていることなどlistという名前の変数、dictsetintfloat

を割り当てませんからdictを削除することもできます。その場合、Pythonはの組み込みコードのにフォールバックします。だから、変数を削除

temp_dict = dict 
del dict # remove the `dict`, now it will delegate to the `dict` builtin 

例えば:

>>> dict = {} 
>>> dict 
{} 
>>> del dict 
>>> dict 
<class 'dict'> 

だから、スコープの外にそれを削除し、Pythonは再び「外側」のスコープにバインドします。

+0

はい私はそれを決してしません。私はそれを尋ねたので、長い間私を悩ませていました。 – Dark

2

Pythonのキーワードを上書きするのは悪い考えです。あなたが戻ってのdictたい場合

、これを使用する:

from builtins import dict 
d = dict() 

しかし、このコードは、再びあなたの定義された辞書を上書きします。したがって、次のコードを使用してスコープを制御することができます。

dict = lambda: 'damn it, I override the buildins' 

d = dict() 
print(d) 

from contextlib import contextmanager 


@contextmanager 
def get_dict_back(): 
    import builtins 
    yield builtins.dict 


with get_dict_back() as build_dict: 
    d = build_dict({'a': 1}) 
    print(d) 

print(dict()) 

with-statementでのみ使用できます。

出力:

damn it, I override the buildins 
{'a': 1} 
damn it, I override the buildins 
+1

"dict"という名前の既存の変数が既に存在しているので、これを行うのは直感的ではないようです。それを名前空間に保存する方が良いでしょう。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅあなたは正しいです、私はそれを良くします。 –

+0

@MenglongLi私は 'ウィレム・ヴァン・オンセム(Willem Van Onsem)'がはるかに簡単だと感じた。 – Dark

関連する問題