【问题标题】:"is" operator exhibiting unexpected behavior in IronPython scripts"is" 运算符在 IronPython 脚本中表现出意外行为
【发布时间】:2013-06-26 01:09:43
【问题描述】:

使用this question 的答案中的建议,我创建了一个新类型 (_NotInFile) 和单例实例 (NotInFile) 来表示一系列 IronPython 脚本中的特殊条件。我在 Python 和 IronPython(从命令行)中测试了我的实现,并看到了正确和预期的行为。

然后,我将我的代码传递给了一位同事,该同事通过 C# 的动态脚本功能在一个大型 Visual Studio 项目中使用我的脚本。使用完全相同的脚本,当检查 itm.data_attr 中的值明确表明它是 _NotInFile 类型并且只能是我创建的单例实例时,他看到表达式 itm.data_attr is NotInFile return false

需要明确的是,我的同事自己并没有使用 NotInFile 对象。相反,他正在调用我的一个脚本,该脚本实例化一组对象(其中一些具有分配了 NotInFile 单例的属性),然后根本不对该集合进行操作,而是调用我的另一个脚本来处理该集合。当我(从命令行测试脚本)进行相同的调用时,is 操作员按预期执行,当他执行相同的操作时,它似乎失败了。

我唯一能想到的是,C# 可能会为调用摄取和处理脚本而实例化 IronPython 的单独“副本”,并且每个副本都会在不同的内存地址实例化它自己的单例副本,所以实际上,在第二个脚本中实例化的单例与存储在第一个脚本中实例化的单例的引用不是同一个对象。

我是否正确识别了问题?如果是这样,是否可以指示 C# 动态脚本系统在 IronPython 的同一个实例中运行两个单独的脚本?

【问题讨论】:

  • 嗯。不应该是itm.data_attr is _NotInFile吗?我希望你没有把这整篇……文章……写在一个被遗忘的下划线上!
  • 不,这就是类型,我正在尝试与该类型的单例对象进行比较(类似于 None 和 NoneType - 我应该使用 NotInFileType 来使类型保持一致)。无论如何,问题在于以两种不同方式运行相同代码时的行为差异。直接从 IronPython 测试脚本调用代码时,代码运行良好。
  • 您提出的问题可能是您的问题的原因。您必须提供有关如何使用脚本的更多信息,因为 C# 本身不会做任何事情。您还可以查看使用的 Ironpython 版本 (import sys; print(sys.version_info);),因为过去存在一些问题(我认为使用 equals 运算符比使用 is 关键字更多,但谁知道)。
  • 我将尝试从调用脚本的人那里获取 C# 调用代码。我很确定我们的 IronPython 版本是兼容的,因为我们之前在这种使用场景中交换了大量代码。

标签: c# ironpython dynamic-script-loading


【解决方案1】:

除了在 StackOverflow 上发布此问题外,我还向我的同事发送了该问题的链接。他能够确定他正在实例化 IronPython 运行时的两个不同实例,因此这两个单例实际上是不同的对象。

他稍微更改了代码,以便在 Python 运行时的单个实例中运行这两个脚本,并且代码开始表现出与我的测试中相同(正确)的行为。因此,我的两个问题的答案都是“是”(问题是两个运行时,而 C# 可以使用同一个运行时来调用多个不同的脚本)。

一旦我从我的同事那里学到了修复 C# 问题所需的确切步骤,我将更新这个答案。

【讨论】:

    猜你喜欢
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    相关资源
    最近更新 更多