3

我在 windows7 上安装了 64 位 CPython 3.4。我使用 pythonnet 包(2.0.0.dev1)。我想实例化动作委托,但它给了我一个错误。

def display(num):
     print("num=", num)

import clr
clr.AddReference("System")
import System

paction=System.Action[System.Int32](display)

我收到此错误:

() 中的 TypeError Traceback (最近一次调用最后一次) ----> 1 paction=System.Action[System.Int32](display) TypeError: unsubscriptable object

我想这是指定泛型的方式。

我已经检查了文档和这篇文章,但仍然没有看到问题。我也使用了 Overload 方法,但也没有帮助:

paction=System.Action.Overloads[System.Int32](display)

() 中的 TypeError Traceback (最近一次调用最后一次) ----> 1 paction=System.Action.Overloads[System.Int32](display) TypeError: No match found for constructor signature

4

2 回答 2

4

问题是System.Action(没有参数,因此不是泛型)System.Action<T>System.Func直接映射到System.Func<T>. 我想这是因为System.Func总会一个泛型参数,并且似乎有一个针对泛型的重载实现。

Python.NET 中泛型的名称是Action`1(通常:泛型参数Action`NN数量)。您可以通过getattr在模块上使用来获取包装器对象:

Action = getattr(System, "Action`1")
action = Action[Int32](display)
于 2016-02-22T10:29:40.550 回答
1

我也面临这个问题。我创建了一个在 Python.Net 中使用 Actions 的变通方法

使用以下代码创建一个 .net 类库项目:

using System;

namespace PythonHelper
{
    public class Generics
    {

        public static Action<T1, T2> GetAction<T1, T2>(Func<T1, T2, object> method)
        {
            return (a, b) => method(a,b);
        }

    }
}

将其编译为 dll 文件并将其包含在您的 Python.net 项目中 ( clr.AddReference('PythonHelper'))

现在在您的 Python.net 项目中,您可以使用以下代码创建泛型:

import clr
clr.AddReference('PythonHelper')
import System
from System import DateTime, Func
from PythonHelper import Generics

def myCallback(a,b):
    print a, b

func = Func[DateTime, DateTime, System.Object](myCallback)
action = Generics.GetAction[DateTime, DateTime](func)

如果您需要创建具有更多或更少参数的操作,则必须自己添加另一个 GetAction 方法。

于 2016-02-08T13:17:09.290 回答