Напечатать код функции python

Как я могу получить исходный код функции Python?

Я могу получить имя функции, используя foo.func_name . Как я могу программно получить исходный код, как я набрал выше?

Я не понимаю ваш вопрос. Не могли бы вы уточнить предложение «как я могу получить» и решить путаницу с «func_name» и «somemethod»? Спасибо!

13 ответов

Если функция принадлежит исходному файлу, доступному в файловой системе, то для inspect.getsource(foo) может потребоваться inspect.getsource(foo) :

Если foo определяется как:

def foo(arg1,arg2): #do something with args a = arg1 + arg2 return a 
import inspect lines = inspect.getsource(foo) print(lines) 
def foo(arg1,arg2): #do something with args a = arg1 + arg2 return a 

Но я считаю, что если функция скомпилирована из строки, потока или импортирована из скомпилированного файла, то вы не сможете получить исходный код.

Возвращает кортеж; tuple [0] — это список строк, представляющих строки исходного кода, а tuple [1] — это номер строки в контексте выполнения, где он был запущен. В IPython; это номер строки в ячейке, а не весь блокнот

Этот ответ явно не упоминает об этом, но inspect.getsource (foo) возвращает источник в одной строке вместо кортежа, где tuple [0] — это список строк. getsource будет более полезен, если вам нужно заглянуть в реп

В проверять модуль есть методы для извлечения исходного кода из объектов python. По-видимому, он работает только в том случае, если источник находится в файле. Если бы у вас было это, я думаю, вам не нужно было бы получать источник из объекта.

Да, похоже, он работает только для объектов, определенных в файле. Не для тех, которые определены в переводчике.

Я попытался использовать inspect в интерпретаторе python 3.5.3 . import inspect + inspect.getsource(foo) работал нормально.

@AndréChristofferAndersen AndréChristofferAndersen Да, но это не должно работать для функций, определенных в интерпретаторе

dis является вашим другом, если исходный код недоступен:

>>> import dis >>> def foo(arg1,arg2): . #do something with args . a = arg1 + arg2 . return a . >>> dis.dis(foo) 3 0 LOAD_FAST 0 (arg1) 3 LOAD_FAST 1 (arg2) 6 BINARY_ADD 7 STORE_FAST 2 (a) 4 10 LOAD_FAST 2 (a) 13 RETURN_VALUE 

Если вы используете IPython, вам нужно ввести «foo??»

In [19]: foo?? Signature: foo(arg1, arg2) Source: def foo(arg1,arg2): #do something with args a = arg1 + arg2 return a File: ~/Desktop/ Type: function 

Очень полезно в записной книжке IPython и Jupyter, если / когда вы случайно удалили несколько ячеек, содержащих функции, которые вы только что потратили на создание и тестирование .

Читайте также:  If ie 8 html dir ltr lang ru class ie8 endif

Хотя я обычно соглашаюсь с тем, что inspect является хорошим ответом, я бы не согласился с тем, что вы не можете получить исходный код объектов, определенных в интерпретаторе. Если вы используете dill.source.getsource из dill , вы можете получить источник функций и лямбда, даже если они определены в интерактивном режиме. Он также может получить код для связанных или несвязанных методов и функций класса, определенных в карри. однако вы не сможете скомпилировать этот код без прилагаемого объектного кода.

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

@Ant6n: Ant6n: ну, это просто подлый. dill.source.getsource проверяет историю интерпретатора на наличие функций, классов, лямбда-выражений и т. д. — он не проверяет содержимое строк, передаваемых в exec.

Это кажется очень интересным. Можно ли использовать dill для ответа на этот вопрос: stackoverflow.com/questions/13827543/…

@ArtOfWarfare: частично, да. dill.source есть функции, такие как getname и importable и getsource которые фокусируются на получении исходного кода (или импортируемого, который возвращает объект) для любого данного объекта. Для простых вещей, таких как int источник отсутствует , поэтому он не работает должным образом (т. Е. Для «a = 10» возвращается «10»).

Однако это работает для глобалов: >>> a = 10; print( Напечатать код функции python[0] )

@MikeMcKerns: я приложил все усилия, чтобы ответить на этот вопрос без использования dill , но мой ответ оставляет желать лучшего (например, если у вас есть несколько имен для одного и того же значения, он не может выяснить, какое из них использовалось. Если Вы передаете выражение, оно не может сказать, что это было за выражение. Черт, если вы передадите выражение, которое соответствует имени, оно даст это имя вместо этого.) Может ли dill устранить любой из этих недостатков мой ответ здесь: stackoverflow.com/a/28634996/901641

@ArtOfWarfare: dill.source использует inspect кода, определенного в файле . и анализирует буфер памяти интерпретатора для кода, определенного в интерпретаторе. Возможно, это поможет вам подобрать правильное имя для нескольких объектов (см. Приведенный выше ответ для примера с lambda ). Однако, не знаю, как это сделать для a = 1 . Мне нравится ваш ответ на вопрос, который вы связали выше.

@MikeMcKerns: Спасибо, что упомянули, что он использует буфер памяти интерпретатора. Я проверил исходный код и понял, что он просто использует readline . Я играл с ним на OS X, и он работает блестяще. К сожалению, я получаю ImportError в Windows . должен выяснить, доступен ли эквивалентный модуль для Windows. Я, вероятно, обновлю ответ, с которым я уже связался, с помощью некоторого кода, использующего readline позже. Редактировать: О, только что нашел pyreadline для Windows. Еще не играл с этим.

Читайте также:  Html подсветка синтаксиса python

Источник

Получение исходного кода функции в Python

Часто возникает ситуация, когда необходимо получить исходный код функции в Python. Представим, что есть функция, которая выглядит следующим образом:

Часто возникает ситуация, когда необходимо получить исходный код функции в Python. Представим, что есть функция, которая выглядит следующим образом:

def my_function(arg1, arg2): # обработка аргументов result = arg1 + arg2 return result

Можно получить имя функции, используя my_function.__name__ . Но что делать, если нужно получить исходный код этой функции? Для этого можно использовать модуль inspect из стандартной библиотеки Python.

Модуль inspect предоставляет несколько функций, которые помогают получить информацию о живых объектах, таких как модули, классы, методы, функции, трассировки, кадры стека и объекты кода. Сюда входит и функция getsource() , которая возвращает текст исходного кода объекта.

Применение этой функции к примеру выше будет выглядеть следующим образом:

import inspect def my_function(arg1, arg2): # обработка аргументов result = arg1 + arg2 return result source_code = inspect.getsource(my_function) print(source_code)

После выполнения этого кода в консоли будет выведен исходный код функции my_function .

Таким образом, модуль inspect и его функция getsource() могут быть очень полезными, когда необходимо получить исходный код функции в Python. Однако стоит помнить, что это работает только для функций, определенных в исходном коде (не скомпилированных или встроенных), и код должен быть доступен.

Источник

Как посмотреть тело функции в python?

phaggi

Поскольку самая популярная и эталонная реализация Python: CPython имеет открытый исходный код, вы можете найти исходники встроенных функций в репозитории с исходными кодами CPython: https://github.com/python/cpython.
Некоторые встроенные функции написаны не на Python, а на том языке, на котором написан сам интерпретатор Python: на Си, поэтому, скорее всего, там вы не найдёте легкочитаемый исходный код функций sum, min, max и др.
Но в случае, когда функция или любой другой объект написан на Python, посмотреть его исходный код можно с помощью inspect.getsource:

>>> import inspect >>> import requests >>> print(inspect.getsource(requests.get)) def get(url, params=None, **kwargs): r"""Sends a GET request. :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary, list of tuples or bytes to send in the query string for the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response """ return request("get", url, params=params, **kwargs)

Получить исходный код встроенной функции или метода, реализованного на Си внутри CPython, таким способом не получится:

>>> import inspect >>> print(inspect.getsource(sum)) Traceback (most recent call last): File "", line 1, in File "/usr/lib/python3.10/inspect.py", line 1139, in getsource lines, lnum = getsourcelines(object) File "/usr/lib/python3.10/inspect.py", line 1121, in getsourcelines lines, lnum = findsource(object) File "/usr/lib/python3.10/inspect.py", line 940, in findsource file = getsourcefile(object) File "/usr/lib/python3.10/inspect.py", line 817, in getsourcefile filename = getfile(object) File "/usr/lib/python3.10/inspect.py", line 797, in getfile raise TypeError('module, class, method, function, traceback, frame, or ' TypeError: module, class, method, function, traceback, frame, or code object was expected, got builtin_function_or_method
In [1]: import requests In [2]: %psource requests.get def get(url, params=None, **kwargs): r"""Sends a GET request. :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary, list of tuples or bytes to send in the query string for the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response """ return request("get", url, params=params, **kwargs)

Источник

Читайте также:  Php variables что это

Получение исходного кода функции в Python

Часто возникает ситуация, когда необходимо получить исходный код функции в Python. Представим, что есть функция, которая выглядит следующим образом:

Часто возникает ситуация, когда необходимо получить исходный код функции в Python. Представим, что есть функция, которая выглядит следующим образом:

def my_function(arg1, arg2): # обработка аргументов result = arg1 + arg2 return result

Можно получить имя функции, используя my_function.__name__ . Но что делать, если нужно получить исходный код этой функции? Для этого можно использовать модуль inspect из стандартной библиотеки Python.

Модуль inspect предоставляет несколько функций, которые помогают получить информацию о живых объектах, таких как модули, классы, методы, функции, трассировки, кадры стека и объекты кода. Сюда входит и функция getsource() , которая возвращает текст исходного кода объекта.

Применение этой функции к примеру выше будет выглядеть следующим образом:

import inspect def my_function(arg1, arg2): # обработка аргументов result = arg1 + arg2 return result source_code = inspect.getsource(my_function) print(source_code)

После выполнения этого кода в консоли будет выведен исходный код функции my_function .

Таким образом, модуль inspect и его функция getsource() могут быть очень полезными, когда необходимо получить исходный код функции в Python. Однако стоит помнить, что это работает только для функций, определенных в исходном коде (не скомпилированных или встроенных), и код должен быть доступен.

Источник

Оцените статью