Existe uma maneira de ver como as funções incorporadas funcionam em python? Não quero dizer apenas como usá-los, mas também como eles foram construídos, qual é o código por trás classificado ou enumerado etc ...?
Existe uma maneira de ver como as funções incorporadas funcionam em python? Não quero dizer apenas como usá-los, mas também como eles foram construídos, qual é o código por trás classificado ou enumerado etc ...?
Respostas:
Como o Python é de código aberto, você pode ler o código-fonte .
Para descobrir em qual arquivo um módulo ou função específico está implementado, geralmente você pode imprimir o __file__
atributo. Como alternativa, você pode usar o inspect
módulo, consulte a seção Recuperando código-fonte na documentação de inspect
.
Para classes e métodos internos, isso não é tão simples desde então inspect.getfile
e inspect.getsource
retornará um erro de tipo informando que o objeto está interno. No entanto, muitos dos tipos internos podem ser encontrados no Objects
subdiretório do tronco de origem do Python . Por exemplo, veja aqui a implementação da classe enumerada ou aqui a implementação do list
tipo.
sorted()
está em /Python/bltinmodule.c embora apenas chama list.sort()
assim a fonte real está em /Objects/listobject.c
Aqui está uma resposta do livro de receitas para complementar a resposta do @Chris ' , o CPython mudou para o GitHub e o repositório do Mercurial não será mais atualizado:
git clone https://github.com/python/cpython.git
O código fará o checkout para um subdiretório chamado cpython
->cd cpython
print()
...egrep --color=always -R 'print' | less -R
Python/bltinmodule.c
->builtin_print()
Aproveitar.
Eu tive que cavar um pouco para encontrar a fonte do seguinte, Built-in Functions
pois a pesquisa renderia milhares de resultados. (Boa sorte procurando qualquer um desses para descobrir onde está a fonte)
De qualquer forma, todas essas funções são definidas em bltinmodule.c
Funções, que começam combuiltin_{functionname}
Fonte interna : https://github.com/python/cpython/blob/master/Python/bltinmodule.c
Para tipos internos: https://github.com/python/cpython/tree/master/Objects
listobject.c
github.com/python/cpython/tree/master/Objects
O shell do iPython facilita isso: function?
fornece a documentação. function??
mostra também o código. Mas isso só funciona para funções python puras.
Depois, você sempre pode fazer o download do código-fonte do Python (c).
Se você estiver interessado em implementações pitônicas da funcionalidade principal, dê uma olhada na fonte PyPy .
2 métodos,
help()
inspect
1) inspecionar:
use o módulo inpsect para explorar o código desejado ... NOTA: você pode explorar o código apenas para pacotes de módulos (aka) importados
por exemplo:
>>> import randint
>>> from inspect import getsource
>>> getsource(randint) # here i am going to explore code for package called `randint`
2) ajuda ():
você pode simplesmente usar o help()
comando para obter ajuda sobre funções internas, bem como seu código.
por exemplo: se você deseja ver o código para str (), basta digitar - help(str)
retornará assim,
>>> help(str)
Help on class str in module __builtin__:
class str(basestring)
| str(object='') -> string
|
| Return a nice string representation of the object.
| If the argument is a string, the return value is the same object.
|
| Method resolution order:
| str
| basestring
| object
|
| Methods defined here:
|
| __add__(...)
| x.__add__(y) <==> x+y
|
| __contains__(...)
| x.__contains__(y) <==> y in x
|
| __eq__(...)
| x.__eq__(y) <==> x==y
|
| __format__(...)
| S.__format__(format_spec) -> string
|
| Return a formatted version of S as described by format_spec.
|
| __ge__(...)
| x.__ge__(y) <==> x>=y
|
| __getattribute__(...)
-- More --
Um recurso bastante desconhecido é o Python Developer Guide .
Em uma edição (um pouco) recente do GH , foi adicionado um novo capítulo para abordar a pergunta que você está fazendo: Layout do código-fonte do CPython . Se algo mudar, esse recurso também será atualizado.
Conforme mencionado por @Jim, a organização do arquivo é descrita aqui . Reproduzido para facilitar a descoberta:
Para módulos Python, o layout típico é:
Lib/<module>.py Modules/_<module>.c (if there’s also a C accelerator module) Lib/test/test_<module>.py Doc/library/<module>.rst
Para módulos somente de extensão, o layout típico é:
Modules/<module>module.c Lib/test/test_<module>.py Doc/library/<module>.rst
Para tipos internos, o layout típico é:
Objects/<builtin>object.c Lib/test/test_<builtin>.py Doc/library/stdtypes.rst
Para funções internas, o layout típico é:
Python/bltinmodule.c Lib/test/test_builtin.py Doc/library/functions.rst
Algumas exceções:
builtin type int is at Objects/longobject.c builtin type str is at Objects/unicodeobject.c builtin module sys is at Python/sysmodule.c builtin module marshal is at Python/marshal.c Windows-only module winreg is at PC/winreg.c
enumerate
?