Python pode imprimir uma definição de função?

112

Em JavaScript, pode-se imprimir a definição de uma função. Existe uma maneira de fazer isso em Python?

(Só estava brincando no modo interativo, e queria ler um módulo sem open (). Só estava curioso).

Eddie Welker
fonte
Você tem a fonte da função. O que há de errado nisso?
S.Lott
1
E no modo interativo, você pode usar help (function) para exibir a docstring da função.
monkut
Há uma duplicata desta pergunta: stackoverflow.com/questions/427453/…
Anderson Green

Respostas:

157

Se você estiver importando a função, pode usar inspect.getsource:

>>> import re
>>> import inspect
>>> print inspect.getsource(re.compile)
def compile(pattern, flags=0):
    "Compile a regular expression pattern, returning a pattern object."
    return _compile(pattern, flags)

Isto irá trabalhar na linha de comando interativa, mas aparentemente apenas em objetos que são importados (não objetos definidos dentro do prompt interativo). E, claro, só funcionará se o Python puder encontrar o código-fonte (portanto, não em objetos integrados, libs C, arquivos .pyc, etc)

Tríptico
fonte
As funções criadas em tempo de execução (incluindo o prompt interativo) também não têm um arquivo ou número de roupa, o que faz sentido
John La Rooy,
Isso parece ser o que eu estava procurando. Obrigado!
Eddie Welker,
9
Que tal imprimir uma definição de função que defini anteriormente no interpretador Python interativo atual? Isso é possível?
GL2014
@ GL2014: Sim, veja minha resposta.
Mike McKerns,
Posso confirmar que esta resposta e inspect.getsource () FAZ trabalho sobre interativa (ipython3) funciton definido em Python 3.6.9 (Ubuntu).
Gnudiff
97

Se estiver usando iPython , você pode usar function_name?para obter ajuda e function_name??imprimir o código-fonte, se puder.

Peter
fonte
2
às vezes você precisa separar a função em outra linha para chamar? por exemplo, model.function ?? não funciona, mas f = model.function; f ?? obras
thecheech
12

Esta é a maneira que descobri como fazer:

    import inspect as i
    import sys
    sys.stdout.write(i.getsource(MyFunction))

Isso remove os novos caracteres de linha e imprime a função de maneira adequada

Steve
fonte
1
Exemplo quebrado aqui, deveria ser i.getsource (MyFunction).
dia
10

Embora eu geralmente concorde que inspecté uma boa resposta, discordo que você não pode obter o código-fonte dos objetos definidos no interpretador. Se você usar dill.source.getsourcefrom dill, poderá obter a origem das funções e lambdas, mesmo que sejam definidos interativamente. Ele também pode obter o código de métodos e funções de classe associada ou não definida em curries ... entretanto, você pode não ser capaz de compilar esse código sem o código do objeto envolvente.

>>> from dill.source import getsource
>>> 
>>> def add(x,y):
...   return x+y
... 
>>> squared = lambda x:x**2
>>> 
>>> print getsource(add)
def add(x,y):
  return x+y

>>> print getsource(squared)
squared = lambda x:x**2

>>> 
>>> class Foo(object):
...   def bar(self, x):
...     return x*x+x
... 
>>> f = Foo()
>>> 
>>> print getsource(f.bar)
def bar(self, x):
    return x*x+x

>>> 
Mike McKerns
fonte
1
às vezes não funciona diretamente com: getsource (my_function) , mas então eu poderia fazê-lo funcionar com getsource (my_function.func_code)
Afflatus
2

Use help(function)para obter a descrição da função.

Você pode ler mais sobre help() aqui .

Safwan
fonte
1
não tinha a fonte definida em help for me.
ansuman
-6

Você pode usar a palavra-chave __doc__:

#print the class description
print string.__doc__
#print function description
print open.__doc__
Amirshk
fonte
1
Essa é a descrição, não a definição.
Triptych
para muitos builtins (como regra, funções definidas em módulos C), ele inclui a assinatura da função também, mas não em geral.
u0b34a0f6ae
1
Enquanto estiver no shell interativo, "help (object)" exibirá isso de uma forma mais navegável.
TK.
@kaizer Uma assinatura de função também não é uma definição. O que __doc__ realmente retorna é tudo o que o autor do código colocou na string doc (a string entre aspas triplas). Nada mais nada menos.
Triptych
Acho que a definição é ambígua aqui. Para mim, pode significar o docstring ou o texto do código ou ambos ou mesmo o objeto do código em um trecho
John La Rooy
-6

Você pode usar o __doc__na função, tome a hog()função como exemplo: Você pode ver o uso de hog()assim:

from skimage.feature import hog

print hog.__doc__

O resultado será:

Extract Histogram of Oriented Gradients (HOG) for a given image.
Compute a Histogram of Oriented Gradients (HOG) by

    1. (optional) global image normalisation
    2. computing the gradient image in x and y
    3. computing gradient histograms
    4. normalising across blocks
    5. flattening into a feature vector

Parameters
----------
image : (M, N) ndarray
    Input image (greyscale).
orientations : int
    Number of orientation bins.
pixels_per_cell : 2 tuple (int, int)
    Size (in pixels) of a cell.
cells_per_block  : 2 tuple (int,int)
    Number of cells in each block.
visualise : bool, optional
    Also return an image of the HOG.
transform_sqrt : bool, optional
    Apply power law compression to normalise the image before
    processing. DO NOT use this if the image contains negative
    values. Also see `notes` section below.
feature_vector : bool, optional
    Return the data as a feature vector by calling .ravel() on the result
    just before returning.
normalise : bool, deprecated
    The parameter is deprecated. Use `transform_sqrt` for power law
    compression. `normalise` has been deprecated.

Returns
-------
newarr : ndarray
    HOG for the image as a 1D (flattened) array.
hog_image : ndarray (if visualise=True)
    A visualisation of the HOG image.

References
----------
* http://en.wikipedia.org/wiki/Histogram_of_oriented_gradients

* Dalal, N and Triggs, B, Histograms of Oriented Gradients for
  Human Detection, IEEE Computer Society Conference on Computer
  Vision and Pattern Recognition 2005 San Diego, CA, USA

Notes
-----
Power law compression, also known as Gamma correction, is used to reduce
the effects of shadowing and illumination variations. The compression makes
the dark regions lighter. When the kwarg `transform_sqrt` is set to
``True``, the function computes the square root of each color channel
and then applies the hog algorithm to the image.
startag.cv
fonte
1
A questão era sobre definição de função e não docstring de função.
ctrl-alt-delor