[PYTHON] Verwenden Sie kein Hash (), wenn Sie Ausdauer benötigen!

Das Folgende ist eine Geschichte über hash (), eine integrierte Funktion von Python 3.3.

KaoriYa Version Vim unterstützt jetzt Python 3.3, sodass jedi-vim 3.3 nicht unterstützt. Als ich versuchte, jedi-vim zum Arbeiten zu bringen, bemerkte ich, dass jedi, das von jedi-vim verwendet wurde, die Cache-Datei nicht öffnen konnte. Ich tat.

Das Problem besteht darin, den Namen der Cache-Datei zu generieren

jedi/cache.py


def _get_hashed_path(self, path):
    return self._get_path('%s_%s.pkl' % (self.py_version, hash(path)))

Dies liegt daran, dass das Ergebnis von hash () nicht deterministisch ist, um genau zu sein, der Determinismus von hash () dabei geschlossen wird.

Lassen Sie es uns tatsächlich überprüfen.

$ python3.3
    ...
>>> hash("spam")
-2615809667644326338
>>> hash("spam")
-2615809667644326338
>>>
$ python3.3
    ...
>>> hash("spam")
5272786964549530217
>>> hash("spam")
5272786964549530217
>>>

Sie können sehen, dass sich der Rückgabewert von "Hash (" Spam ")" von Prozess zu Prozess ändert.

Der jedi-Fehler trat nur in Python 3.3 in Python 3.3 auf Hashes wurden aus Sicherheitsgründen randomisiert eingebaute Funktionen und Typen).

Vorerst war Geschwindigkeit nicht erforderlich. Wenn die Python-Version 3.3 oder höher ist, verwenden Sie hashlib.md5 (). Ich habe versucht, es zu beheben.

Abgesehen davon ist jedi immer noch nicht mit Python 3.3 kompatibel, da 3.3 einen neuen Mechanismus für Namespace-Pakete und imp.find_module () eingeführt hat. Der Hauptgrund ist, dass imp.html # imp.find_module) veraltet ist.

Verwenden Sie zur Hand importlib.find_loader (), um imp.find \ _module () "like" -Ergebnisse zurückzugeben Ich habe eine Funktion geschrieben, um sie zu täuschen, aber bitte veröffentlichen Sie sie nicht, da es sich um einen temporären Code handelt. m (\ _ \ _) m

Recommended Posts

Verwenden Sie kein Hash (), wenn Sie Ausdauer benötigen!
Wenn Sie den SCP beim Portieren nicht kennen
Sie müssen Anaconda nicht installieren, um eine maschinelle Lernumgebung zu erstellen. Verwenden wir Miniconda
Was tun, wenn Sie bei Verwendung von ortoolpy.logistics_network keine japanischen Spaltennamen verwenden möchten?
Wenn Sie python2.x unter modernem Gentoo Linux verwenden möchten