2017-09-17 6 views
3

Ich habe dem Schlüsselwort dict versehentlich ein Wörterbuch zugewiesen, jetzt führt es zu dict object not callable. Wie kann ich die Funktionalität neu zuweisen, ohne den Kernel neu zu starten?Wie kann die dict-Funktionalität wieder dem 'dict' zugewiesen werden?

+1

'del dict' sollte funktionieren? – ayhan

+0

Ja ... das ist ein Betrogener (seit du gefragt hast). –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Sie sind wirklich gut darin, Duplikate zu finden. :-) – Dark

Antwort

3

dict ist ein builtin. Builtins sind im builtin Paket zusammengefasst. So können Sie verwenden:

import builtins 
dict = builtins.dict 

Ein Ratschlag ist zu nie builtins außer Kraft setzen: nicht zuordnen zu Variablen namens list, dict, set, int, float usw.

aber sagen, dass Sie können auch dict aus dem Bereich entfernen. In diesem Fall wird Python Fallback auf den Builtins. So Sie die Variable löschen:

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

Zum Beispiel:

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

Sie es so löschen aus dem Rahmen, und dann wird Python wieder binden sie an den "äußeren" scope.

+0

Ja werde ich das nie tun. Es nervte mich schon lange, also fragte ich es. – Dark

2

Es ist eine schlechte Idee, die Schlüsselwörter in Python zu überschreiben.

Wenn Sie möchten, Dict zurück, verwenden Sie diese:

from builtins import dict 
d = dict() 

Aber diese Codes wieder Ihre definierten dict außer Kraft setzen. So können Sie die folgenden Codes verwenden, um den Umfang zu steuern:

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()) 

Die buildin dict ist nur verfügbar in der mit-Anweisung.

Ausgang:

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

Es scheint kontra intuitiv, dies zu tun, weil es bereits eine vorhandene Variable namens "dict" gibt, die Sie auch nicht beschatten möchten. Es im Namespace zu behalten wäre besser. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Sie haben Recht, ich werde es besser machen. –

+0

@MenglongLi obwohl ich fühlte, 'Willem Van Onsem' ist viel einfacher. – Dark

Verwandte Themen