Python 不是一种同类语言。@当你向公众提供建议时,ninjagecko的安全性总是一个问题。大多数读者来这里是因为他们在用谷歌搜索问题。我不认为很多人会一字不差地复制这个答案;相反,他们会把学到的概念应用到自己的问题上。@Ant6n:那只是偷偷摸摸而已dill.s

Python 不是一种同类语言。@当你向公众提供建议时,ninjagecko的安全性总是一个问题。大多数读者来这里是因为他们在用谷歌搜索问题。我不认为很多人会一字不差地复制这个答案;相反,他们会把学到的概念应用到自己的问题上。@Ant6n:那只是偷偷摸摸而已dill.s,python,function,Python,Function,不是一种同类语言。@当你向公众提供建议时,ninjagecko的安全性总是一个问题。大多数读者来这里是因为他们在用谷歌搜索问题。我不认为很多人会一字不差地复制这个答案;相反,他们会把学到的概念应用到自己的问题上。@Ant6n:那只是偷偷摸摸而已dill.source.getsource检查解释器的函数、类、lambda等的历史记录——它不检查传递给exec的字符串的内容。这看起来非常有趣。可以用dill来回答这个问题吗:@ArtOfWarfare:部分,是的dill.source具有类似于get



不是一种同类语言。@当你向公众提供建议时,ninjagecko的安全性总是一个问题。大多数读者来这里是因为他们在用谷歌搜索问题。我不认为很多人会一字不差地复制这个答案;相反,他们会把学到的概念应用到自己的问题上。@Ant6n:那只是偷偷摸摸而已
dill.source.getsource
检查解释器的函数、类、lambda等的历史记录——它不检查传递给exec的字符串的内容。这看起来非常有趣。可以用dill来回答这个问题吗:@ArtOfWarfare:部分,是的
dill.source
具有类似于
getname
importable
getsource
的函数,这些函数专注于获取任何给定对象的源代码(或生成该对象的导入表)。对于像
int
这样的简单对象,没有源代码,因此它不能按预期工作(即,对于'a=10'返回'10')。但是,这对全局变量有效:
>>a=10;打印([key for key,val in globals().items(),如果val是a][0])
@MikeMcKerns:我已经尽了最大努力回答了这个问题,没有使用
dill
,但我的答案还有点不尽如人意(也就是说,如果同一个值有多个名称,它就不知道使用了哪个。如果传入一个表达式,它就说不出该表达式是什么。见鬼,如果传入一个计算结果与名称相同的表达式,它就会给出该名称。)
dill
可以解决我的答案中的任何缺点吗:tuple;tuple[0]是表示源代码行的字符串列表,tuple[1]是运行源代码的执行上下文中的行号。在IPython中,这是单元格中的行号,而不是整个记事本。此答案没有明确提及它,而是inspect.getsource(foo)返回单个字符串中的源,而不是元组中的元组,其中元组[0]是行列表。如果需要查看repl,则getsource将更有用,例如,函数
len
。在哪里可以找到
len
函数或
inspect.getsourcelines(foo)的源代码
@oaklander113 inspect.getsource与标准库中的大多数函数一样,无法使用内置函数。您可以在处检查源代码中的cpython,否则将无法使用,因为解释器会将foo编译为字节码并丢弃源代码,如果您尝试运行
getsource(foo),将引发操作错误
@0sh就普通python解释器而言,这是一个很好的观点。但是上面的代码示例在使用IPython时有效。对内置项抛出一个TypeError。@本体因为它们通常没有python源代码,所以如果/当您意外删除了一个以上的单元格时,它们在IPython和Jupyter笔记本中会非常有用t包含您刚刚花了一天时间创建和测试的函数……对于谁,谁丢失了整个类:您可以通过方法还原它:
dir(MyClass)
,然后是
MyClass.\uuuu init\uuuu???
等等。请注意,在Python 3中,您可以使用
foo获取函数名。\uu name\uuuuuu
您还可以获得
def foo(arg1,arg2):
    #do something with args
    a = arg1 + arg2
    return a
TypeError: <built-in function max> is not a module, class, method, function, traceback, frame, or code object
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                
funcstring = 'lambda x: x> 5'
func = eval(funcstring)
func.source = funcstring
>>> 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
>>> 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

>>> 
>>> 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
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
import inspect
print( "".join(inspect.getsourcelines(foo)[0]))
import inspect

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

print(inspect.getsource(get_my_code))
import inspect

def main():
    x, f = 3, lambda a: a + 1
    print(inspect.getsource(f))

if __name__ == "__main__":
    main()
    x, f = 3, lambda a: a + 1
from mini_lambda import x, is_mini_lambda_expr
import inspect

def get_source_code_str(f):
    if is_mini_lambda_expr(f):
        return f.to_string()
    else:
        return inspect.getsource(f)

# test it

def foo(arg1, arg2):
    # do something with args
    a = arg1 + arg2
    return a

print(get_source_code_str(foo))
print(get_source_code_str(x ** 2))
def foo(arg1, arg2):
    # do something with args
    a = arg1 + arg2
    return a

x ** 2