2015-06-05 5 views
2

У меня есть 64-разрядная установка CPython 3.4 на windows7. Я использую пакет pythonnet (2.0.0.dev1). Я хочу создать экземпляр действия делегата, но это дает мне ошибку.python3 общие делегаты pythonnet

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

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

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

Я получаю эту ошибку:

TypeError Traceback (most recent call last) in() ----> 1 paction=System.Action[System.Int32](display) TypeError: unsubscriptable object

Я предполагаю, что это путь один должен указать дженерики.

Я проверил документ и сообщение this и все еще не вижу проблемы. я palyed немного с методом перегрузки, но не помогло:

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

TypeError Traceback (most recent call last) in() ----> 1 paction=System.Action.Overloads[System.Int32](display) TypeError: No match found for constructor signature

ответ

2

Проблема заключается в том, что System.Action (без аргументов и, следовательно, не общий) является слежка System.Action<T> в то время как System.Func карты непосредственно в System.Func<T>. Я думаю, это потому, что System.Func будет всегда имеют общий параметр, и, кажется, существует реализация перегрузки для дженериков.

Общее имя генератора в Python.NET: Action`1 (в общем случае: Action`N с N является числом общих аргументов). Вы можете получить оберточный объект, используя getattr на модуле:

Action = getattr(System, "Action`1") 
action = Action[Int32](display) 
+1

Хорошо, это кажется более легитимным методом. Я не знал, что дженерики обрабатываются таким образом на Python.net, поскольку он просто работал в IronPython. @ user2281723 вы должны принять это решение поверх моего. –

1

Я также сталкиваются с этой проблемой. Я создал работу вокруг, чтобы использовать действия в Python.Net

Создать проект библиотеки классов .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); 
     } 

    } 
} 

Компиляция это в файл длл и включить его в свой проект 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) 

Если вам необходимо создать действие с мором e или менее, вам нужно добавить еще один метод GetAction.

+0

Кажется, это разумное решение. Интересно, работает ли Func, почему они пренебрегли действием. Спасибо! – user2281723

+0

Потому что это проект с открытым исходным кодом и запросы на получение приветствуются! – denfromufa