我有文件A.py:
...
from System.IO import Directory
...
execfile('B.py')
和文件B.py:
...
result = ['a','b'].Contains('a')
这样的组合效果很好。但是,如果我在A.py中评论此特定的导入行,则B.py会抱怨:
AttributeError:“列表”对象没有属性“包含”
我觉得这很奇怪,尤其是B.py本身运行良好。
System.IO模块中是否有一些“列表”替代?有什么方法可以确定在导入期间进行了哪些更改?还是避免这种奇怪的行为?
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')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句