【问题标题】:Python .NET: "Cannot instantiate enumeration"Python .NET:“无法实例化枚举”
【发布时间】:2014-02-04 11:26:04
【问题描述】:

所以我设法在 Python .NET 中导入了一个托管的 .NET 程序集,并设置了几个对象并调用了一些函数,但我不知道这个程序应该如何工作。

这是我要移植的 C# 代码:

            // read event sticky clears all initial events
            CML_EVENT_STATUS status=0;
            xAxisAmp.ReadEventSticky(ref status);
            statusTextBox.Text = Convert.ToString(status);

我可以导入CML_EVENT_STATUS,它报告它是<class 'CMLCOMLib.CML_EVENT_STATUS'>,但是当我尝试创建它的实例时,我得到了这个错误:

>>> stat = CML_EVENT_STATUS()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot instantiate enumeration

如果还有其他方法可以调用该函数,我无法弄清楚。我试过调用xAxisAmp.ReadEventSticky()xAxisAmp.ReadEventSticky(0),它们只返回TypeError: No method matches given arguments

我得到的最接近的是来自xAxisAmp.ReadEventSticky(CML_EVENT_STATUS)的这个错误:

System.ArgumentException: Object of type 'System.RuntimeType' cannot be converted to type 'CMLCOMLib.CML_EVENT_STATUS&'.

我做错了什么?我找不到任何关于声明枚举类型或通过引用传递它们的文档,这让我发疯。

【问题讨论】:

  • Python 在 3.4 中添加了一个Enum 类:docs.python.org/3.4/library/enum.html 你的枚举是基于这个吗?如果是这样,status = CML_EVENT_STATUS(0) 应该等同于您的第一行。
  • 或者例如如果0 的名字是SOME_EVENT,我希望你可以简单地写CML_EVENT_STATUS.SOME_EVENT 来获得那个值。
  • 这是在 Python 2.7 中的,我也尝试过。同样的cannot instantiate enumeration 错误。您可以像您说的那样访问枚举名称,但我仍然无法调用该函数。
  • 我无法重现此问题。请参阅 pastebin.com/c3eAca14 的 C# 代码和 pastebin.com/z1SEWbvT 的 Python 控制台日志,因此 CML_EVENT_STATUS.SOME_EVENT(使用正确的名称)应该适合您。注意ref 参数是如何处理的,作为this question 中的返回值(Python for .NET 与 IronPython 在这里的工作方式相同)
  • 酷,我会把它变成答案。

标签: c# python python.net


【解决方案1】:

在 Python .NET 中像这样实例化枚举的正确方法是:

stat = CML_EVENT_STATUS.EVENT_STATUS_BRAKE

然后你可以像这样调用方法:

stat = amp.ReadEventSticky(stat)

请注意,refout 参数在 Python 中的工作方式与在 C# 中的工作方式不同。如Writing iron python method with ref or out parameter 中更详细的描述,refout 参数是从方法返回的,而不是修改传入的变量。如果有多个返回值(例如,方法返回一个值并且有一个ref 参数),那么会先返回一个元组,方法的返回值先,然后依次是refout 参数。

假设ReadEventStickyvoid,这很简单:它只返回新的CML_EVENT_STATUS 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2021-04-18
    • 2017-08-19
    相关资源
    最近更新 更多