ironpython에서 파이썬 코드를 분석 할 수있는 도우미 메소드가 있습니까?IronPython의 코드 체인을 분석하십시오.
def bar(b):
return foo(b)
def foo(f):
return filters.delta(f) #This is a reference added to the scope from C#
x = 1
bar(x)
내가 바 같은 스크립트에서 호출하는 방법을 filters.delta
알 필요가이 스크립트 예를 들어 주어 (X)> foo는 (B)> filters.delta (F)
수이 IronPython에서 수행해야합니까, 아니면 스크립트를 직접 파싱해야합니까? 아니고 아주 쉬운 일
배경 정보
이 FreePIE라고위한 소프트웨어. 그것의 스크립트 가능한 입력 출력 에뮬레이터. 그것은 util 함수 세트를 가지고 있습니다. 이 코드를 고려하십시오.
mouse.deltaX = filters.delta(joystick[0].x)
그것은 절대 x는 조이스틱이나 게임 패드의 좌표합니다 filers.delta
를 사용하여 델타 값을 가져옵니다 상대 x는 델타 값을 얻으려면 마우스의
좌표 설정 사이에 두 개의 샘플을 비교해야 내 소프트웨어 스크립트 실행에서는 util 함수가이를 처리합니다.
[NeedIndexer]
public double delta(double x, string indexer)
{
var lastSample = x;
if (deltaLastSamples.ContainsKey(indexer))
lastSample = deltaLastSamples[indexer];
deltaLastSamples[indexer] = x;
return x - lastSample;
}
그러나 마지막 샘플을 저장해야한다는 점을 해결하십시오. 당신이 볼 수 있듯이 마지막 샘플을 담고있는 콜렉션을 색인 할 수있는 문자열을 취한다. 나는 사용자가이 인덱스를 단순하게 처리하도록 요구하고 싶지 않다. 그래서 내가 스크립트를 준비하고 [NeedIndexer]
속성을 가진 모든 메소드를 찾는다. 하나를 찾으면 메서드 인수를 구문 분석하고이를 인덱서로 사용합니다. 그래서 위와 같이 찾고 파이썬 스크립트 joystick[0].x
는 고유하므로 코드가 작동이 예에서는
mouse.deltaX = filters.delta(joystick[0].x, "joystick[0].x")
를 분석 한 후 다음과 같이하지만 사용자가 거기에서 filters.delta
를 파이썬 함수를 정의하고 사용하는 경우 그 인덱스 것 모든 샘플에 대해 동일한 변수 이름.
는 내가 만드는 희망 스크립트를 구문 분석에 대한 현재의 코드 내가 달성하기 위해 노력하고있는 무슨이 더 명확
나는 제프의 대답
을에 조금 더 감사를받은 업데이트var engine = IronPython.Hosting.Python.CreateEngine();
var script = @"def foo(y):
return filters.delta(y)
def bar(x):
return foo(x)
bar(-5)
";
var ast = @"import ast
tree = ast.parse(script)
callback(ast.dump(tree))";
var callback = new Action<object>(o =>
{
Console.WriteLine(o);
});
engine.SetSearchPaths(new[] { "pylib" });
var scope = engine.CreateScope();
scope.SetVariable("script", script);
scope.SetVariable("callback", callback);
engine.Execute(ast, scope);
ast.dump
을 사용하여 전체 트리를 문자열로 덤프 할 수 있었지만 어떻게 발견 되었습니까? 재귀 적으로 트리를 반복한다. filters.delta
호출을 찾을 때까지이 작업을 수행 한 다음 백업을 다시 트래버스하고 체인의 각 함수에 인수를 추가해야합니다. ast 모듈에 대한 그물에 대한 많은 정보가 없습니다. 이 사람은 어떻게 이것이 일어날 수 있는지 알고 있습니다. _fields
회원이 ast.parse
에 의해 반환되는 개체에 있습니다. 그러나 거기서 나가기 위해 밖으로 찾을 수 없습니다.
호기심,이 질문은 C# 태그와 어떤 관련이 있습니까? – Jsinh
음, IronPython을 모든 .NET 언어에서 사용할 수 있다고 생각합니다. 하지만 C#을 사용합니다. – Anders
반짝임을 지울 수있는 배경 정보를 추가했습니다. – Anders