PythonNet документирует это не так четко, как IronPython, но делает почти то же самое.
Итак, давайте посмотрим на документацию IronPython для ref
и out
параметров а>:
Язык Python передает все аргументы по значению. Нет синтаксиса, указывающего, что аргумент должен передаваться по ссылке, как в языках .NET, таких как C# и VB.NET, с помощью ключевых слов ref и out. IronPython поддерживает два способа передачи аргументов ref или out в метод: неявный и явный.
Неявным способом аргумент обычно передается в вызов метода, и его (потенциально) обновленное значение возвращается из вызова метода вместе с обычным возвращаемым значением (если есть). Это хорошо сочетается с возможностью множественных возвращаемых значений Python…
Явным образом вы можете передать экземпляр clr.Reference[T]
в качестве аргумента ref или out, и его поле Value будет установлено вызовом. Явный способ полезен, если есть несколько перегрузок с параметрами ref…
Есть примеры и для того, и для другого. Но чтобы адаптировать его к вашему конкретному случаю:
itemIDs, itemNames = GetItems()
Или, если вы действительно хотите:
itemIDsRef = clr.Reference[Array[int]]()
itemNamesRef = clr.Reference[Array[String]]()
GetItems(itemIDs, itemNames)
itemIDs, itemNames = itemIDsRef.Value, itemNamesRef.Value
CPython с использованием PythonNet делает в основном то же самое. Самый простой способ сделать out
параметры — не передавать их и принимать как дополнительные возвращаемые значения, а для ref
параметров передавать входные значения в качестве аргументов и принимать выходные значения в качестве дополнительных возвращаемых значений. Как и неявное решение IronPython. (За исключением того, что функция void
с параметрами ref
или out
всегда возвращает None
перед аргументами ref
или out
, даже если это не так в IronPython.) Вы можете легко понять это, проверив возвращаемые значения. Итак, в вашем случае:
_, itemIDs, itemNames = GetItems()
Между тем, тот факт, что это массивы, не усложняет ситуацию. Как поясняется в документах, PythonNet предоставляет итерируемый интерфейс для всех коллекций IEnumerable
, а также протокол последовательности. а также для Array
. Итак, вы можете сделать это:
for itemID, itemName in zip(itemIDs, itemNames):
print itemID, itemName
И объекты Int32
и String
будут преобразованы в собственные объекты int
/long
и str
/unicode
так же, как если бы они были возвращены напрямую.
Если вы действительно хотите явно преобразовать их в собственные значения, вы можете это сделать. map
или понимание списка даст вам список Python из любого итерируемого объекта, включая оболочку PythonNet вокруг Array
или другого IEnumerable
. И вы можете явно сделать long
или unicode
из Int32
или String
, если вам нужно. Так:
itemIDs = map(int, itemIDs)
itemNames = map(unicode, itemNames)
Но я не вижу большого преимущества в этом, если только вам не нужно, например, предварительно проверять все значения перед использованием любого из них.
person
abarnert
schedule
25.10.2013