Encontrando o código fonte das funções internas do Python?

142

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 ...?

user1073865
fonte

Respostas:

135

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 inspectmó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.getfilee inspect.getsourceretornará um erro de tipo informando que o objeto está interno. No entanto, muitos dos tipos internos podem ser encontrados no Objectssubdiretório do tronco de origem do Python . Por exemplo, veja aqui a implementação da classe enumerada ou aqui a implementação do listtipo.

Chris
fonte
Você pode dar um exemplo com enumerate?
Benjamin
após o OP, que tal o código-fonte para "classificado"? é claro, inspect.getsourcefile (classificado) não funciona.
Quetzalcoatl
2
@Quetzalcoatl o código fonte sorted()está em /Python/bltinmodule.c embora apenas chama list.sort()assim a fonte real está em /Objects/listobject.c
Boris
35

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:

  1. Instale o Git, se necessário.
  2. git clone https://github.com/python/cpython.git

  3. O código fará o checkout para um subdiretório chamado cpython->cd cpython

  4. Digamos que estamos procurando a definição de print()...
  5. egrep --color=always -R 'print' | less -R
  6. Aha! Veja Python/bltinmodule.c->builtin_print()

Aproveitar.

kevinarpe
fonte
21

insira a descrição da imagem aqui

Eu tive que cavar um pouco para encontrar a fonte do seguinte, Built-in Functionspois 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.cFunçõ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

user1767754
fonte
1
Uma lista é um objeto / tipo, não uma função interna. Você pode encontrar os detalhes de implementação em listobject.c github.com/python/cpython/tree/master/Objects
user1767754
19

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 .

tback
fonte
1
O PyPy usa o RPython para a maioria das coisas embutidas, que podem ser quase tão baixas quanto C quanto quase tão altas quanto Python. Geralmente é no meio. Em ambos os casos, é digitado estaticamente, portanto, não é realmente Python.
2
Veja um projeto cedo para visualizar o código-fonte de uma função interna: github.com/punchagan/cinspect
Thomas
8

2 métodos,

  1. Você pode verificar o uso do snippet usando help()
  2. você pode verificar o código oculto desses módulos usando 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  --
Mohideen bin Mohammed
fonte
4
O OP quer ver especificamente o código, a ajuda fornece apenas documentação.
0xc0de 25/09
6

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.

Dimitris Fasarakis Hilliard
fonte
1

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 theres 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
Mateen Ulhaq
fonte