检查脚本中是否覆盖了内置function/class/type/module?
Check if a built-in function/class/type/module has been over-written during the script?
问题
我们收到一个奇怪的错误**,我们怀疑这是因为我们的 script.py*** 分配了一个已经具有某些内置含义的变量。例如。
str = 2
有什么方法可以检查是否发生了这种情况?
到目前为止
我们认为它会涉及:
在脚本开头分配一个列表,包含所有内置对象的字符串名称:
builtin_names = get_builtin_var_names() # hypothetical function
在脚本末尾分配一个列表,包含所有用户分配的对象的字符串名称:
user_names = get_user_var_names() # hypothetical function
求交集,判断是否为空:
overwritten_names = list(set(user_names) & set(builtin_names))
if overwritten_names:
print("Whoops")
相关
**Silent error,对于那些对此感兴趣的人来说,它是无声的,即它完成时没有错误代码但值它吐出相同代码的两个实现之间的差异,称它们为 A 和 B...两个版本都需要我们制作的两个模块(单独的文件)的 运行(changes.py 和 dnds.py),但是:
- 版本 A:涉及 运行 changes.py -> pickle 中间数据(放入 .p 文件) -> dnds.py、
- 版本 B:涉及 运行 changes.py -> return 数据(字典)作为 dnds.py -> dnds.py.
并且出于某种原因,只有版本 A 具有正确的最终值(以 MATLAB's dnds function 为基准)。
***script.py,其实就是dnds.py (who has imported changes.py). You can find all the code, but to test the two alternative versions I was talking about in ** you need to specifically look at dnds.py,那一行:CTRL+F: "#@TODO:Urgent:debug:2016-11-28:"
。找到该行后,您可以阅读该注释行的其余部分,了解如何复制版本 B 及其产生的静默错误 ** 的说明。出于某种原因,我必须对数据进行腌制才能使其正常工作...当我直接 return 指令时,我得到了错误的 dN/dS 值。
您可以通过字典__builtins__
获取内建函数的名称(和值)。您可以使用 globals()
获取全局变量的名称(和值),使用 locals()
获取局部变量的名称(和值)。所以你可以这样做:
import __builtin__
name, val = None, None
for name, val in locals().iteritems():
if hasattr(__builtin__, name) and getattr(__builtin__, name) != val:
print("{} was overwritten!".format(name))
然后 globals()
也是如此。这将检查本地命名空间中是否有任何对象在内置命名空间中具有不同的值。 (需要将 name
和 val
设置为 None 以便变量在调用 locals
之前存在,否则您将收到 "dictionary changed sized during iteration" 错误,因为名称在循环的中途添加。)
您还可以使用像 pylint 这样的工具来检查此类错误。
问题
我们收到一个奇怪的错误**,我们怀疑这是因为我们的 script.py*** 分配了一个已经具有某些内置含义的变量。例如。
str = 2
有什么方法可以检查是否发生了这种情况?
到目前为止
我们认为它会涉及:
在脚本开头分配一个列表,包含所有内置对象的字符串名称:
builtin_names = get_builtin_var_names() # hypothetical function
在脚本末尾分配一个列表,包含所有用户分配的对象的字符串名称:
user_names = get_user_var_names() # hypothetical function
求交集,判断是否为空:
overwritten_names = list(set(user_names) & set(builtin_names)) if overwritten_names: print("Whoops")
相关
**Silent error,对于那些对此感兴趣的人来说,它是无声的,即它完成时没有错误代码但值它吐出相同代码的两个实现之间的差异,称它们为 A 和 B...两个版本都需要我们制作的两个模块(单独的文件)的 运行(changes.py 和 dnds.py),但是:
- 版本 A:涉及 运行 changes.py -> pickle 中间数据(放入 .p 文件) -> dnds.py、
- 版本 B:涉及 运行 changes.py -> return 数据(字典)作为 dnds.py -> dnds.py.
并且出于某种原因,只有版本 A 具有正确的最终值(以 MATLAB's dnds function 为基准)。
***script.py,其实就是dnds.py (who has imported changes.py). You can find all the code, but to test the two alternative versions I was talking about in ** you need to specifically look at dnds.py,那一行:CTRL+F: "#@TODO:Urgent:debug:2016-11-28:"
。找到该行后,您可以阅读该注释行的其余部分,了解如何复制版本 B 及其产生的静默错误 ** 的说明。出于某种原因,我必须对数据进行腌制才能使其正常工作...当我直接 return 指令时,我得到了错误的 dN/dS 值。
您可以通过字典__builtins__
获取内建函数的名称(和值)。您可以使用 globals()
获取全局变量的名称(和值),使用 locals()
获取局部变量的名称(和值)。所以你可以这样做:
import __builtin__
name, val = None, None
for name, val in locals().iteritems():
if hasattr(__builtin__, name) and getattr(__builtin__, name) != val:
print("{} was overwritten!".format(name))
然后 globals()
也是如此。这将检查本地命名空间中是否有任何对象在内置命名空间中具有不同的值。 (需要将 name
和 val
设置为 None 以便变量在调用 locals
之前存在,否则您将收到 "dictionary changed sized during iteration" 错误,因为名称在循环的中途添加。)
您还可以使用像 pylint 这样的工具来检查此类错误。