Чтобы использовать именованные аргументы, вы должны определить метод статически. Например, я просто помещу все операции DSL в статический класс Operations
.
public static class Operations {
public static void Ping(string Message) {
Console.WriteLine(Message);
}
}
Тогда будут работать именованные аргументы:
var engine = Python.CreateEngine();
var scope = engine.CreateScope();
// Load the assembly where the operations are defined.
engine.Runtime.LoadAssembly(Assembly.GetExecutingAssembly());
// Import the operations modules, settings their names as desired.
engine.Execute(@"
from Operations import Ping
", scope);
// Now named arguments will work...
var script = @"
Ping(Message = ""Ping!"")
";
engine.Execute(script, scope);
Теперь, если бы я мог дать вам совет; Я бы предпочел реализовать настоящий Python API в Python и при необходимости возвращать этот вызов в мой .NET-код. Например, вместо «операций», определенных в C #, у вас будет файл Operations.py
, который определяет ваш Python DSL:
# Get access to your .NET API
import clr
clr.AddReference("MyAPI")
import MyAPI
# Define the Ping call to call into your .NET API
def Ping(Message):
MyAPI.Ping(Message)
И ваш код хостинга вообще не нужно менять.
Оба являются допустимыми решениями, но последнее позволяет легко перебирать DSL.
Удачи!