Python-Interna. Ostereier

Hallo! Auf Habré gab es einige Artikel über die Ostereier der Python, aber es scheint, dass nicht erwähnt wurde, wie dies alles von innen angeordnet war.

Ich denke, dass es vor allem für Anfänger interessant sein wird. Dies wird unter dem Schnitt besprochen!

Welches Python-Osterei fällt mir zuerst ein?

Natürlich Zen of Python (importiere dies)

Gehen Sie zum Python- Quellordner oder öffnen Sie den Github .
Hier ist seine Quelle:

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


Und wie? Eine Art Perlbrei ... Warum mussten Sie sich die Mühe machen, ein Zeichen per Code zu bekommen? Unverständlich.

Mach weiter. Wir suchen nach Antigravitation auf dem Github. Wir finden das:

Bild

Wie Sie sehen, gibt es kein Modul.

Was bedeutet das? Wenn Sie versuchen möchten, das Konfigurationsskript auszuführen, wird möglicherweise die gewünschte Datei generiert. Führen Sie ./configure im Python-Quellordner aus.

Wir überprüfen den Lib-Ordner und finden dort antigravity.py

Sein Inhalt:

Antigravitation
 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:])) 

Beim Import sehen wir, wie unser Standardbrowser geöffnet wird und welche Seite darin enthalten ist
mit einem Python-Comic.

https://xkcd.com/353/

Übrigens gibt es in der Antigravitation, wie Sie sehen können, auch eine Geohash-Funktion, die, wie Sie vielleicht erraten haben,
Erzeugt einen Hash aus Breite, Länge und Datum.

Was haben wir noch? Richtig, __future__ Modul. Eine separate c-Datei wird dafür im Quell- / Python-Ordner zugewiesen. Wenn jemand nicht wusste, wann Sie über die Importfunktion __future__ schreiben
Sie importieren diese Funktion nicht, sondern weisen den Interpreter an, sie zu verwenden. Aus diesem Grund sollte sich diese Anweisung am Anfang der Datei befinden. Hier sind die interessantesten Stellen im Modulcode in C;

C-Code
 //    #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; } 


Nun, das scheint alles zu sein :-)

Aber am Ende des Memes über Python ist es positiv!



PS: Ich hoffe, keiner der Programmierer auf der Perle war beleidigt, es sind viele coole Sachen darauf geschrieben.

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


All Articles