我有文件A.py:
...
from System.IO import Directory
...
execfile('B.py')
和文件B.py:
...
result = ['a','b'].Contains('a')
这种组合很好。 但如果我在A.py评论这条特殊的进口线,那么B.py抱怨:
AttributeError:' list'对象没有属性'包含'
对我来说这看起来很奇怪,尤其是B.py单独运行。
是否有一些'列表'在模块System.IO中覆盖?有没有办法确定在导入过程中发生了什么变化?或者避免这种奇怪的行为?
答案 0 :(得分:1)
B.py
(在IPy 2.7.4上)也会导致您提供的错误。应该没有为该调用绑定的内置方法。您也可以尝试在标准python上重现这一点以确保。
将“B.py
”包含到A.py
中的方式具有固有的风险和问题,至少是因为缺少对B中的代码执行范围的控制。如果将代码包装在适当的模块/类中,则可以确定没有这类问题。
这可以(简化,只是一个函数,没有类等)看起来像:
from B import getResult
getResult()
from System.IO import Directory
getResult()
和
def getResult():
from System.IO import Directory
result = ['a','b'].Contains('a')
return result
正如您所看到的,函数getResult
可以确保所有导入和其他范围属性都是正确的,无论调用站点是否具有给定的导入,它都将起作用。
至于导致System.IO.Directory
导致IronPython.dll!IronPython.Runtime.List.Contains(object value)
绑定的原因尚不清楚,需要密切关注IronPython的内部实现。
如果您介意实际导入到System.IO.Directory
但又不想重构代码,则可以使用LINQ for IronPython/ImportExtensions,因为这样也会提供Contains
方法。这不会减少,但实际上会增加您的导入样板,但更重要的是。
import clr
clr.AddReference("System.Core")
import System
clr.ImportExtensions(System.Linq)
result = ['a','b'].Contains('a')