Internes Python. Oeufs de Pâques

Salut Sur Habré, il y avait pas mal d'articles sur les oeufs de Pâques du python, mais il semble qu'il n'y avait aucune mention de la façon dont tout cela était organisé de l'intérieur.

Je pense que ce sera surtout intéressant pour les pythonistes débutants. Cela sera discuté sous la coupe!

Quel œuf de Pâques en python vous vient à l'esprit en premier?

Bien sûr Zen of Python (importez ceci)

Accédez au dossier source Python ou ouvrez le github .
Voici sa source:

RAWS
s = """Gur Mra bs Clguba, ol Gvz Crgref Ornhgvshy vf orggre guna htyl. Rkcyvpvg vf orggre guna vzcyvpvg. Fvzcyr vf orggre guna pbzcyrk. Pbzcyrk vf orggre guna pbzcyvpngrq. Syng vf orggre guna arfgrq. Fcnefr vf orggre guna qrafr. Ernqnovyvgl pbhagf. Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf. Nygubhtu cenpgvpnyvgl orngf chevgl. Reebef fubhyq arire cnff fvyragyl. Hayrff rkcyvpvgyl fvyraprq. Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff. Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg. Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu. Abj vf orggre guna arire. Nygubhtu arire vf bsgra orggre guna *evtug* abj. Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn. Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn. Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!""" d = {} for c in (65, 97): for i in range(26): d[chr(i+c)] = chr((i+13) % 26 + c) print("".join([d.get(c, c) for c in s])) 


Comment? Une sorte de bouillie perl ... Pourquoi avez-vous dû vous soucier d'obtenir un personnage par code? Ce n'est pas clair.

Allez-y. Nous recherchons l'antigravité sur le github. Nous trouvons ceci:

image

Comme vous pouvez le voir, il n'y a pas de module.

Qu'est-ce que cela signifie? Qu'il est temps d'essayer d'exécuter le script de configuration, il va peut-être générer le fichier souhaité. Exécutez ./configure dans le dossier source Python.

Nous vérifions le dossier Lib et y trouvons antigravity.py

Son contenu:

antigravité
 import webbrowser import hashlib webbrowser.open("https://xkcd.com/353/") def geohash(latitude, longitude, datedow): '''Compute geohash() using the Munroe algorithm. >>> geohash(37.421542, -122.085589, b'2005-05-26-10458.68') 37.857713 -122.544543 ''' # https://xkcd.com/426/ h = hashlib.md5(datedow).hexdigest() p, q = [('%f' % float.fromhex('0.' + x)) for x in (h[:16], h[16:32])] print('%d%s %d%s' % (latitude, p[1:], longitude, q[1:])) 

Lors de l'importation, nous voyons comment notre navigateur par défaut s'ouvre et la page qu'il contient
avec une bande dessinée en python.

https://xkcd.com/353/

Soit dit en passant, dans l'antigravité, comme vous pouvez le voir, il existe également une fonction geohash, qui, comme vous pouvez le deviner,
Génère un hachage à partir de la latitude, de la longitude et de la date.

Qu'avons-nous d'autre? À droite, module __future__. Un fichier c distinct lui est alloué dans le dossier source / Python. Si quelqu'un ne savait pas quand vous écrivez à partir de la fonction d'importation __future__
Vous n'importez pas cette fonctionnalité, mais dites à l'interpréteur de l'utiliser. Pour cette raison, cette instruction doit se trouver au début du fichier. Voici les endroits les plus intéressants dans le code du module en C;

Code C
 //    #define UNDEFINED_FUTURE_FEATURE "future feature %.100s is not defined" #define ERR_LATE_FUTURE \ "from __future__ imports must occur at the beginning of the file" //    static int future_check_features(PyFutureFeatures *ff, stmt_ty s, PyObject *filename) { int i; asdl_seq *names; assert(s->kind == ImportFrom_kind); names = s->v.ImportFrom.names; for (i = 0; i < asdl_seq_LEN(names); i++) { alias_ty name = (alias_ty)asdl_seq_GET(names, i); const char *feature = PyUnicode_AsUTF8(name->name); if (!feature) return 0; //   ,   if (strcmp(feature, FUTURE_NESTED_SCOPES) == 0) { continue; } else if (strcmp(feature, FUTURE_GENERATORS) == 0) { continue; //  ,    } //             //    } else if (strcmp(feature, FUTURE_BARRY_AS_BDFL) == 0) { ff->ff_features |= CO_FUTURE_BARRY_AS_BDFL; } else if (strcmp(feature, FUTURE_GENERATOR_STOP) == 0) { continue; } else if (strcmp(feature, FUTURE_ANNOTATIONS) == 0) { ff->ff_features |= CO_FUTURE_ANNOTATIONS; } else if (strcmp(feature, "braces") == 0) { PyErr_SetString(PyExc_SyntaxError, "not a chance"); //    ,     PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset + 1); return 0; } else { PyErr_Format(PyExc_SyntaxError, UNDEFINED_FUTURE_FEATURE, feature); //-  ,   PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset + 1); return 0; } } return 1; } //     if (s->kind == ImportFrom_kind) { identifier modname = s->v.ImportFrom.module; if (modname && _PyUnicode_EqualToASCIIString(modname, "__future__")) { //   if (done) { PyErr_SetString(PyExc_SyntaxError, ERR_LATE_FUTURE); //           PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset); return 0; } if (!future_check_features(ff, s, filename)) return 0; ff->ff_lineno = s->lineno; } else { done = 1; } } else { done = 1; } } return 1; } 


Eh bien, cela semble être tout :-)

Mais à la fin du mème sur le python, c'est positif!



PS: J'espère qu'aucun des codeurs sur la perle n'a été offensé, beaucoup de trucs sympas y sont écrits.

Source: https://habr.com/ru/post/fr430308/


All Articles