IronPython奇怪的行为

亚历克斯

我有文件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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章