[PYTHON] N'utilisez pas hash () lorsque vous avez besoin de persistance!

Ce qui suit est une histoire sur hash (), qui est une fonction intégrée de Python 3.3.

KaoriYa version Vim prend désormais en charge Python 3.3, donc jedi-vim ne prend pas en charge 3.3. Quand j'essayais de tromper jedi-vim) pour qu'il fonctionne, j'ai remarqué que jedi utilisé par jedi-vim n'ouvrait pas le fichier de cache. J'ai fait.

Le problème est de générer le nom du fichier cache

jedi/cache.py


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

C'est parce que le résultat de hash () est non déterministe, pour être exact, le déterminisme de hash () est fermé dans le processus.

Vérifions-le réellement.

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

Vous pouvez voir que la valeur de retour de hash (" spam ") change d'un processus à l'autre.

L'erreur jedi ne s'est produite que dans Python 3.3 dans Python 3.3 [les hachages étaient aléatoires pour des raisons de sécurité](http://docs.python.jp/3.3/whatsnew/3.3.html# fonctions et types intégrés).

Pour le moment, la vitesse n'était pas nécessaire, donc si la version Python est 3.3 ou supérieure, utilisez hashlib.md5 (). J'ai essayé de le réparer.

En passant, jedi n'est toujours pas compatible avec Python 3.3 car 3.3 a introduit un nouveau mécanisme pour les packages d'espace de noms et imp.find_module (). La raison principale est que imp.html # imp.find_module) est obsolète.

À portée de main, utilisez importlib.find_loader () pour renvoyer des résultats imp.find \ _module () "like" J'ai écrit une fonction pour la tromper, mais veuillez vous abstenir de la publier car c'est un code temporaire. m (\ _ \ _) m

Recommended Posts

N'utilisez pas hash () lorsque vous avez besoin de persistance!
Lorsque vous ne connaissez pas le SCP lorsque vous portez en avant
Vous n'avez pas besoin d'installer Anaconda pour créer un environnement d'apprentissage automatique. Utilisons Miniconda
Que faire si vous ne souhaitez pas utiliser de noms de colonnes japonais lors de l'utilisation d'ortoolpy.logistics_network
Lorsque vous souhaitez utiliser python 2.x sur Gentoo Linux moderne