IronPython奇怪的行为

时间:2015-04-07 20:08:39

标签: python ironpython

我有文件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中覆盖?有没有办法确定在导入过程中发生了什么变化?或者避免这种奇怪的行为?

1 个答案:

答案 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')