Internos em Python. Ovos de páscoa

Oi Em Habré, havia muitos artigos sobre os ovos de Páscoa da píton, mas parece que não havia menção de como tudo isso foi organizado por dentro.

Eu acho que será interessante principalmente para pythonists iniciantes. Isso será discutido sob o corte!

Qual ovo de páscoa python vem à mente primeiro?

Obviamente, Zen do Python (importe isso)

Vá para a pasta de origem Python ou abra o github .
Aqui está a sua fonte:

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


Como Algum tipo de mingau de perl ... Por que você se preocupou em obter um caractere por código? Não está claro.

Vá em frente. Estamos procurando antigravidade no github. Encontramos o seguinte:

imagem

Como você pode ver, não há módulo.

O que isso significa? Que é hora de tentar executar o script de configuração, talvez gere o arquivo desejado. Execute ./configure na pasta de origem Python.

Verificamos a pasta Lib e encontramos antigravity.py lá

Seu conteúdo:

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

Ao importar, vemos como nosso navegador padrão é aberto e a página nele
com uma história em quadrinhos python.

https://xkcd.com/353/

A propósito, na antigravidade, como você pode ver, também há uma função de geohash, que, como você pode imaginar,
Gera um hash a partir da latitude, longitude e data.

O que mais nós temos? Certo, módulo __future__. Um arquivo c separado é alocado para ele na pasta source / Python. Se alguém não souber quando você escreve a partir do recurso de importação __future__
Você não importa esse recurso, mas peça ao intérprete para usá-lo. Por esse motivo, esta instrução deve estar no início do arquivo. Aqui estão os lugares mais interessantes do código do módulo em C, não vejo o objetivo de trazê-lo.

Código 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; } 


Bem, isso parece ser tudo :-)

Mas no final do meme sobre python, é positivo!



PS: Espero que nenhum dos codificadores da pérola tenha se ofendido, muita coisa legal está escrita nela.

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


All Articles