Есть ли способ просмотреть класс и его код тела через оболочку python? [Дубликат]

Sine Python 3.5 вы можете использовать функцию math.isclose(), если условия

import math

if math.isclose(0.1 + 0.2, 0.3, abs_tol=0.01):
    pass
257
задан Vertexwahn 4 March 2016 в 18:27
поделиться

10 ответов

I считают , что имена переменных не хранятся в файлах pyc / pyd / pyo, поэтому вы не можете получить точные строки кода, если у вас нет исходных файлов.

-2
ответ дан Abgan 25 August 2018 в 04:08
поделиться

Если вы строго определяете функцию самостоятельно, и это относительно короткое определение, решение без зависимостей должно определять функцию в строке и присваивать eval () выражения вашей функции.

Например.

funcstring = 'lambda x: x> 5'
func = eval(funcstring)

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

func.source = funcstring
3
ответ дан cherplunk 25 August 2018 в 04:08
поделиться

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

172
ответ дан Cœur 25 August 2018 в 04:08
поделиться

для подведения итогов:

import inspect
print( "".join(inspect.getsourcelines(foo)[0]))
2
ответ дан douardo 25 August 2018 в 04:08
поделиться

Хотя я обычно соглашаюсь с тем, что 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

>>> 
47
ответ дан Mike McKerns 25 August 2018 в 04:08
поделиться

Если вы используете 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/<ipython-input-18-3174e3126506>
Type:      function
48
ответ дан prashanth 25 August 2018 в 04:08
поделиться

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
70
ответ дан schlamar 25 August 2018 в 04:08
поделиться

Если функция из исходного файла, доступного в файловой системе, может помочь 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                

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

376
ответ дан SmartManoj 25 August 2018 в 04:08
поделиться

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

import inspect

def get_my_code():
    x = "abcd"
    return x

print(inspect.getsource(get_my_code))

Вы можете проверить дополнительные параметры в приведенной ниже ссылке. получить ваш код python

10
ответ дан Szabolcs 25 August 2018 в 04:08
поделиться

Чтобы развернуть ответ runeh:

>>> def foo(a):
...    x = 2
...    return x + a

>>> import inspect

>>> inspect.getsource(foo)
u'def foo(a):\n    x = 2\n    return x + a\n'

print inspect.getsource(foo)
def foo(a):
   x = 2
   return x + a

EDIT: Как указано в @ 0sh, этот пример работает с использованием ipython, но не является простым python. В обоих случаях должно быть хорошо, при импорте кода из исходных файлов.

20
ответ дан TomDotTom 25 August 2018 в 04:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: