【问题标题】:Check if a built-in function/class/type/module has been over-written during the script?检查脚本期间是否覆盖了内置函数/类/类型/模块?
【发布时间】:2016-11-28 02:57:45
【问题描述】:

问题

我们遇到了一个奇怪的错误**,我们怀疑这是因为我们的 script.py*** 分配了一个已经具有某些内置含义的变量。例如。

str = 2

有没有办法检查这是否发生了?


到目前为止

我们认为这将涉及:

  1. 在脚本开头指定一个列表,其中包含所有内置对象的名称作为字符串:

    builtin_names = get_builtin_var_names() # hypothetical function 
    
  2. 在脚本末尾指定一个列表,其中包含所有用户分配对象的名称作为字符串:

    user_names = get_user_var_names() # hypothetical function
    
  3. 找到交叉点,检查是否不为空:

    overwritten_names = list(set(user_names) & set(builtin_names))
    
    if overwritten_names:
         print("Whoops")
    

相关


**静默错误,对于那些对它感兴趣的人来说,它是静默的,即它在没有错误代码的情况下完成,但它吐出的值在两种实现之间有所不同相同的代码,称它们为 A 和 B...这两个版本都需要运行我们创建的两个模块(单独的文件)(changes.py 和 dnds.py),但是:

  • A 版:涉及运行 changes.py -> pickle 中间数据(到 .p 文件中)-> dnds.py,
  • 版本 B:涉及运行 changes.py -> 将数据(字典)作为 dnds.py 的参数返回 -> dnds.py。

由于某种原因,只有版本 A 是具有正确最终值的版本(以 MATLAB's dnds function 为基准)。

***script.py,其实是dnds.py(谁导入了changes.py)。你可以找到all the code,但要测试我在 ** 中讨论的两个替代版本,你需要专门查看dnds.py,即:CTRL+F:"#@TODO:Urgent:debug:2016-11-28:"。找到该行后,您可以阅读该注释行的其余部分,了解如何复制版本 B 及其导致的静默错误**。出于某种原因,我必须对数据进行腌制才能使其正常工作......当我直接返回 dicts 时,我得到了错误的 dN/dS 值。

【问题讨论】:

  • 奇怪的错误是什么样的?
  • 你的例子不是很好,因为function 不是 Python 中的内置名称。
  • 尝试使用常规 Python 而不是 IPython;看起来 IPython 对 __builtins__ 做了一些不寻常的事情,将其别名为模块名称 __builtin__
  • 尝试使用 linter 来捕捉这个
  • @hello_there_andy 您可能需要开启特定检查。

标签: python python-2.7 variables variable-assignment built-in


【解决方案1】:

您可以通过字典 __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() 也一样。这将检查本地命名空间中是否有任何对象在内置命名空间中具有不同的值。 (需要将 nameval 设置为 None 以便在调用 locals 之前变量存在,否则您将收到“迭代期间字典大小更改”错误,因为名称是在循环的中途添加的。)

您还可以使用像 pylint 这样的工具来检查此类错误以及许多其他错误。

【讨论】:

  • 首先谢谢,但我对您提供的代码有概念上的问题,您确定它是“!=”吗?不是“==”?
  • 实际上代码根本不起作用:AttributeError: 'builtin_function_or_method' object has no attribute 'iteritems',我使用的是 Python2.7,这是在您回答之前的标签中,但我会在问题中明确说明。
  • @JonClements 欢呼,编辑现在未编辑,还 *facepalm* 针对自己
  • 使用 locals(),我现在得到:'type' object has no attribute '__getitem__'
  • 是的,我的意思是locals()。我还对我的代码进行了另一项更改。我无法重现您描述的错误。请编辑您的问题以包含完整的错误消息。您确定您遇到的错误是由于此代码,而不是由于您希望使用此策略调试的原始有问题的代码吗?我认为唯一可能导致此类错误的是__builtins__[name],但您似乎不太可能创建自己的对象__builtins__
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多