有没有办法在笔记本中运行包含函数等的.py
文件,以便将.py
文件的内容视为直接在该单元格中?
例如,假设我有文件example.py
,其中定义了函数test1
,该函数调用ipython笔记本中定义的函数test4
。如果我通过example.py
%run examplye.py
运行test4
功能test1
未知import csv
def is_numeric_string(s):
""" Determine if argument is a string representing a numeric value. """
for kind in (int, float, complex):
try:
kind(s)
except (TypeError, ValueError):
pass
else:
return True
else:
return False
columns = []
with open('not_a_csv.txt') as f:
for line in (line.strip() for line in f):
fields = line.split()
if fields: # non-blank line?
if is_numeric_string(fields[0]):
columns[-1] += fields # add fields to the new column
else: # start a new column with this line as its header
columns.append([line])
rows = zip(*columns) # transpose
with open('formatted.csv', 'w') as f:
csv.writer(f, delimiter='\t').writerows(rows)
。这可以被规避吗?
答案 0 :(得分:3)
在Python2中,execfile
函数可以执行您想要的操作。在Python 3中,您必须通过读取文件的内容,编译它然后确保它在正确的命名空间中执行来模拟它。
在我定义的笔记本电脑中:
def f4(x):
return x+x
我有一个文件testme.py
,其中包含以下代码:
f4("something")
以下代码单元似乎可以正确执行文件中的代码:
with open("testme.py") as f:
code = compile(f.read(), "testme.py", 'exec')
exec(code, globals(), locals())
确实按预期打印"somethingsomething"
。
如评论中所述,为了调试已更改的模块,您可以使用reload()
(Python2)或importlib.reload()
重新导入它。但是代码的耦合相当紧密 - 它总是在全局命名空间中寻找相同的函数。这使得测试非常困难,并且考虑依赖注入方法可能更好。假设您的函数如下所示:
def my_func(a, b):
...
f4(something)
...
return result
这必须在其全局命名空间中找到f4
函数。更好耦合的解决方案看起来像这样:
def my_func(a, b, f):
...
f(something)
...
return result
然后用my_func
作为第三个参数调用f4
- 您可以完全控制它调用的函数,如果您想更仔细地检测代码,可以在测试期间使用其他函数,并且您的代码不再需要函数位于调用模块的全局命名空间中 - 您可以将任何函数传递给它。