2014-11-04 8 views
4

Python.NET을 사용하여 Python에서 C# 코드를 호출하는 C# 어셈블리를로드합니다.Python.NET에서 C# Nullable Int32를 작성하여 선택적 int 인수로 C# 메서드 호출

Our.Namespace.Proj.MyRepo 내 방법 :

OutputObject GetData(string user, int anID, int? anOptionalID= null) 

가 나는 경우 경우에 대한 메서드를 호출 할 수 있습니다이 그러나 나는이처럼 보이는 메소드를 호출 문제가 오전, 꽤 깔끔하게 작동 옵션의 3 번째의 인수는 존재 합니다만, 3 번째의 인수가 null의 경우와 일치하도록 (듯이) 무엇을 건네 줄 수 없는지를 나타낼 수 없습니다.

import clr 
clr.AddReference("Our.Namespace.Proj") 
import System 
from Our.Namespace.Proj import MyRepo 

_repo = MyRepo() 

_repo.GetData('me', System.Int32(1), System.Int32(2)) # works! 

_repo.GetData('me', System.Int32(1)) # fails! TypeError: No method matches given arguments 

_repo.GetData('me', System.Int32(1), None) # fails! TypeError: No method matches given arguments 

iPython 노트북은 마지막 인수는 형식이어야한다는 것을 나타냅니다 :

System.Nullable`1[System.Int32] 

귀무 경우를 일치 객체를 생성하는 방법을 그냥 확실하지 않다.

C# 인식 Null 개체를 만드는 방법에 대한 제안 사항이 있으십니까? 네이티브 Python None을 전달한다고 가정했지만, 그렇지 않습니다. 당신이 선택적 매개 변수가 Nullable이라고 말을하는지 때문에

+2

에 인수를 전달해야하지만, 당신이 그것에 없음을 통과하지 않는 경우는, 같다, 아마 만 m를 검색 참조 유형 매개 변수가있는 소수 민족. 마지막 매개 변수없이 오버로드를 시도 할 수 있습니다. 마지막 매개 변수가'object' 인 다른 오버로드로 인해 None (이 경우 작동합니다)을 전달할 수 있습니다. 마지막 인수가 'as int?'인 첫 번째 메서드를 호출합니다. – IllidanS4

+1

오버로드 된 메서드 (세 번째 매개 변수없이 하나 및 하나)를 사용하도록 C# 쪽을 리팩토링하는 작업을 마쳤습니다. Python.NET이이 문제를 처리합니다. 단점은 마지막 매개 변수의 존재를 기반으로 두 가지 방법 중 하나를 조건부로 호출해야한다는 것입니다.마지막 매개 변수가 C# 측에서 세 번째로 오버로딩 된 경우에 대해 'object'가 될 것이라는 제안을 시도하여 None 전달을 허용합니다. 감사! – skulz00

답변

2

[편집]

이이 pythonnet에 합병되었습니다

https://github.com/pythonnet/pythonnet/pull/460


내가 널 (NULL) 원시와 같은 문제로 실행

- Python.NET이 아무튼 나에게 보인다 이러한 유형을 지원하지 않습니다. 나는

if(obType.IsGenericType && obType.GetGenericTypeDefinition() == typeof(Nullable<>)) 
{ 
    if(value == Runtime.PyNone) 
    { 
     result = null; 
     return true; 
    } 
    // Set type to underlying type 
    obType = obType.GetGenericArguments()[0]; 
} 

내가 잘

if (value == Runtime.PyNone && !obType.IsValueType) { 
    result = null; 
    return true; 
} 

아래에이 코드를 배치 Python.Runtime.Converter.ToManagedValue() (\ SRC \ 실행 \ converter.cs)에 다음 코드를 추가하여 문제를 해결 있어요 https://github.com/pythonnet/pythonnet/blob/4df6105b98b302029e524c7ce36f7b3cb18f7040/src/runtime/converter.cs#L320

+0

Python.NET 소스 코드를 수정했다는 말입니까? – skulz00

+1

예, http://sourceforge.net/p/pythonnet/code/147/tree/trunk의 Python.NET 소스 코드를 참조하고 있습니다. – antchi

+0

알았어. 감사! 이 문제를 요약하고 다음 버전에 통합 될 수 있도록 http://sourceforge.net/p/pythonnet/bugs/에 게시합니다. – skulz00

2

나는 이것을 테스트 할 방법이 없지만,

_repo.GetData('me', System.Int32(1), System.Nullable[System.Int32]()) 

을하려고하면 C# 코드에서 새로운 Nullable 유형 Int32의 객체 또는 new System.Nullable<int>()을 작성해야 .

C#에서 선택적 매개 변수가 작동하는 방식이므로 첫 번째 실패한 예제가 작동한다고 가정합니다. 매개 변수를 전혀 지정하지 않고 함수를 호출합니다.

+0

제안 해 주셔서 감사합니다. GetData 호출 외에도'System.Nullable [System.Int32]()'를 만들려고하면 주어진 인수와 일치하는 생성자가 없습니다. 또한'System.Nullable [System.Int32]'를 넘겨 줬는데'ArgumentException : 'System.RuntimeType'형식의 개체를 'System.Nullable \'1 [System.Int32]'형식으로 변환 할 수 없습니다. ' – skulz00

+0

이상한. 저는 파이썬 구문에 익숙하지 않습니다.''1''이 거기에서 무엇을하고 있는지 확실하지 않습니다. 나보다 똑똑한 누군가가이 견과를 깰 수 있기를 바랍니다. 원래 IronPython을 사용하고 있다고 생각 했으므로 선택적 매개 변수를보다 잘 처리 할 수 ​​있으므로 IronPython을 사용하고 싶을 수도 있습니다. – ToastyMallows

+0

그건 파이썬 구문이 아니에요. 제네릭 타입의 .NET 구문입니다. -'1은 1 타입 매개 변수를 의미합니다. – IllidanS4

1

당신은 내가 Python.NET을 모르는 일반적인 기능 System.Nullable[System.Int32](0)