假设我有一个如下定义的Python函数:
def foo(arg1,arg2):
#do something with args
a = arg1 + arg2
return a
Run Code Online (Sandbox Code Playgroud)
我可以使用函数的名称foo.func_name.如上所示,我如何以编程方式获取其源代码?
重复..
我有一个成功运行的方法定义,但想在运行时修改它.
例如:如果我有方法
def sayHello():
print "Hello"
Run Code Online (Sandbox Code Playgroud)
type(sayHello)给我答案'type function'.我能获取此函数对象的源代码字符串吗?它被认为是安全问题吗?
我一直在使用inspectPython 标准库中的模块。
以下示例运行良好(假设inspect已导入):
def foo(x, y):
return x - y
print(inspect.getsource(foo))
Run Code Online (Sandbox Code Playgroud)
...将打印def foo(x, y):\n return x - y\n并...
bar = lambda x, y: x / y
print(inspect.getsource(bar))
Run Code Online (Sandbox Code Playgroud)
...将打印bar = lambda x, y: x / y\n。到目前为止,一切都很好。然而,在下面的例子中事情变得有点奇怪:
print(inspect.getsource(lambda x, y: x / y))
Run Code Online (Sandbox Code Playgroud)
...将打印print(inspect.getsource(lambda x, y: x / y))并...
baz = [2, 3, lambda x, y: x / y, 5]
print(inspect.getsource(baz[2]))
Run Code Online (Sandbox Code Playgroud)
...将打印baz = [2, 3, lambda x, y: x / y, …
当我通过程序中的选项(计算生物学实验)时,我通常会将它们传递给.py文件.
所以我有这个.py文件,如下所示:
starting_length=9
starting_cell_size=1000
LengthofExperiments=5000000
Run Code Online (Sandbox Code Playgroud)
然后我执行文件并获取数据.由于程序全部在我的机器上,没有其他人可以访问它,因此它是安全的.
我也可以很容易地写一个类似的文件:
def writeoptions(directory):
options=""
options+="starting_length=%s%s"%(starting_length,os.linesep)
options+="starting_cell_size=%s%s"%(starting_cell_size,os.linesep)
options+="LengthofExperiments=%s%s"%(LengthofExperiments,os.linesep)
...
open("%s%soptions.py"%(directory,os.sep),'w').write(options)
Run Code Online (Sandbox Code Playgroud)
我想传递一个函数作为参数之一:
starting_length=9
starting_cell_size=1000
LengthofExperiments=5000000
def pippo(a,b):
return a+b
functionoperator=pippo
Run Code Online (Sandbox Code Playgroud)
当然,在真正的实验中,函数pippo会复杂得多.不同于实验到实验.
但我无法做的是自动编写函数.总之,如果其中一个选项是函数,我不知道如何推广writeoptions函数以继续编写选项.我当然可以复制原始文件,但这是不优雅的,低效的(因为它包含许多未被使用的额外选项),并且通常不能解决问题.
你如何让python写下函数的代码,因为它记下了变量的值?