1

私は追加の「無料」ツールとして Iron Python を使用して、通信をカスタム ハードウェアにラップする API をテストし、非開発チームが Python 経由でハードウェアを操作できるようにしています。

void func(params object[] args)ただし、.NETを Python にマップする方法がわかりませんdef (*args)

説明するコードを次に示します。

Console.WriteLine と Debug.WriteLine のシグネチャに従って、ロギング コールバックを挿入してメッセージをフォーマットおよび処理できるタイプがあります。

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);
    }
}

私のIronPythonコードで

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'
4

2 に答える 2

2

String.Formatparams object[]、鉄の python オブジェクト (最初の出力ケースのタプル、最後の 3 つのリストのリスト) を単一のオブジェクトとして処理し、予期しない出力を取得しているため、python コレクションを使用することを認識していないためです。def loggerが呼び出されると、単一の python オブジェクト/タプルが暗黙的に作成されます。

実際のユースケース/スタイルに応じて、さまざまな方法でこれを解決できます。

最も python-y な方法は、Jeff が回答で説明しているように、呼び出しサイトで引数を展開することです。

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

loggerの実装として CLR から as のみを呼び出す場合は、次のような型の単一の (変数ではない) 引数にするAction<string, object[]>ことができます。argsobject[]

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

Python からも可変引数を使用して呼び出したい場合logger(および前後の変換を気にしない場合) は、次のように実行できます。

def logger(msg, *args):
    print( String.Format(msg, Array[object](args)) )
于 2012-08-19T12:26:40.830 に答える