2012-08-17 3 views
1

Iron Python을 '무료'도구로 사용하여 일부 사용자 지정 하드웨어와 통신하는 API를 테스트하여 비 개발 팀이 Python을 통해 하드웨어와 호환 될 수 있도록합니다.IronPython의 변수 인수를 사용하여 CLR 메서드를 호출하는 방법

그러나 .NET을 얻는 방법을 알아낼 수는 없습니다. void func(params object[] args)은 파이썬 def (*args)에 매핑됩니다.

설명 할 코드가 있습니다.

로깅 콜백을 주입하고 메시지를 처리 ​​할 수있는 유형은 Console.WriteLine 및 Debug.WriteLine의 서명과 같습니다. 내 IronPython의 코드에서

public class Engine 
{ 
    Action<string, object[]> _logger; 
    public void Run() 
    { 
     Log("Hello '{0}'", "world"); 
    } 
    public void SetLog(Action<string, object[]> logger) 
    { 
     _logger = logger; 
    } 
    void Log(string msg, params object[] args) 
    { 
     _logger(msg, args); 
    } 
} 

import clr 
from System import * 
from System.IO import Path 
clr.AddReferenceToFileAndPath(Path.GetFullPath(r"MyAssembly.dll")) 
from MyNamespace import * 

def logger(msg, *args): 
    print(String.Format(msg, args)) 
    print(String.Format(msg, list(args))) 
    print(String.Format(msg, [args])) 
    a=[] 
    for i in args: 
     a.append(i) 
    print(String.Format(msg, a)) 

e = Engine() 
e.SetLog(logger) 
e.Run() 

출력

Hello '('world',)' 
Hello 'IronPython.Runtime.List' 
Hello 'IronPython.Runtime.List' 
Hello 'IronPython.Runtime.List' 

내가 좋아하는 것

Hello 'world' 
+0

가능한 중복 배열] (http://stackoverflow.com/questions/1107789/assigning-a-iron-python-list-to-net-array) –

+0

그 게시물의 중복 있다면 다음 중 자신의 질문을 이해하지 못하거나 또는 나는 그들의 것을 이해하지 못한다. (또는 둘 다 :-) –

+0

@HansPassant에 의해 참조 된 질문은 하드 중복이 아니라 가능한 해결책 중 하나를 암시한다고 생각한다. (나의 대답과 conve를 보라. rsion을'Array [object]'로). –

답변

2

String.Format 첫 번째 출력하는 경우에 대한 귀하의 철 파이썬 객체 (튜플을 처리하기 때문에 , 마지막 3 개를 하나의 개체로)를 하나의 개체로 사용하며 파이썬 컬렉션을 params object[]으로 사용하고 싶지 않을 때 예기치 않은 결과가 발생합니다. def logger이 호출 될 때 단일 파이썬 객체/튜플이 암시 적으로 생성됩니다.

실제 사용 사례/스타일에 따라 여러 가지 방법으로 해결할 수 있습니다.

가장 파이썬-Y 방법은 제프와 같은 자신의 호출 사이트의 인수를 확대 할 것이라고 그의 대답에 설명 :

def logger(msg, *args): 
    print(String.Format(msg, *args)) 

만 그냥 args을 가질 수 Action<string, object[]>의 구현으로 CLR에서로 logger를 호출하는 경우 당신은뿐만 아니라 가변 인수 파이썬에서 logger를 호출하려는 경우

def logger(msg, args): 
    print(String.Format(msg, args)) 

같은 유형 object[]의 (가변되지 않음) 하나의 인자 수 (그리고 내가 질문을 오해하고있어하지 않는 한 당신이

def logger(msg, *args): 
    print(String.Format(msg, Array[object](args))) 
+0

감사합니다. Array [object] (args) 솔루션을 사용했습니다. 내가 파이썬을 전혀 사용할 수 없다는 사실은 보너스 다. 그래서 대부분의 사용자에게서 숨겨진이 캐스트는 완벽하게 받아 들일 수있다. –

2

을 할 수 앞뒤로 변환) 상관 없어,이 작업을해야합니다 :

def logger(msg, *args): 
    print(String.Format(msg, *args)) 
.NET에 아이언 파이썬 목록을 지정 [의
+0

call cite에서 var args를 확장하면 더 우아 해 보입니다! 모든 경우에 해당되는 경우 내 대답을 확인/확인하고 삭제합니다. –

관련 문제