当前位置: 首页 > 面试题库 >

在Python中创建C#可空Int32(使用Python.NET)以使用可选的int参数调用C#方法

胡劲
2023-03-14
问题内容

我正在使用Python.NET加载C#程序集以从Python调用C#代码。这很干净,但是我在调​​用如下所示的方法时遇到了问题:

Our.Namespace.Proj.MyRepo中的方法:

OutputObject GetData(string user, int anID, int? anOptionalID= 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 Notebook指示最后一个参数应为以下类型:

System.Nullable`1[System.Int32]

只是不确定如何创建与Null大小写匹配的对象。

关于如何创建C#识别的Null对象的任何建议?我以为通过本地Python None可以,但是不能。


问题答案:

[编辑]

这已合并到pythonnet:

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

我遇到了可空基元的相同问题-
在我看来Python.NET不支持这些类型。我通过在Python.Runtime.Converter.ToManagedValue()(\ src \
runtime \ converter.cs)中添加以下代码来解决此问题

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

https://github.com/pythonnet/pythonnet/blob/4df6105b98b302029e524c7ce36f7b3cb18f7040/src/runtime/converter.cs#L320



 类似资料:
  • 问题内容: 我有一个带几个参数的Python函数。在某些情况下,可以忽略其中一些参数。 这些参数通过是字符串,每个都有不同的含义。我可以选择要以任何组合形式传递的可选参数,这一点很重要。例如,或,,或,或所有它们(这些是我的选择)。 如果我可以重载该函数,那就太好了-但我读到Python不支持重载。我试图在列表中插入一些必需的int参数-并收到参数不匹配错误。 现在,我正在发送空字符串来代替前几个

  • 本文向大家介绍Python使用ctypes调用C/C++的方法,包括了Python使用ctypes调用C/C++的方法的使用技巧和注意事项,需要的朋友参考一下 python使用ctypes调用C/C++ 1. ctpes介绍 ctypes is a foreign function library for Python. It provides C compatible data types, a

  • 我希望有一个泛型类(在类型T中),它保存一个可为空的TS列表。 编译失败,出现以下错误。 错误CS0453:类型't'必须是非空值类型,才能将其用作泛型类型或方法'System.Nullable'中的类型参数't' 我做错了什么?

  • 让我们考虑一下下面的课程 让我们考虑一下这个类有一个可选对象,比如: 是否可以在对象上调用方法,而无需检查是指完整的对象还是仅指空的对象()。比如: 不幸的是,这段代码无法编译。如何做到这一点?

  • 问题内容: 我想创建一个可以与参数一起使用的Python装饰器: 或不使用它们(例如,默认情况下将输出重定向到stderr): 那有可能吗? 请注意,我并不是在寻找重定向输出问题的其他解决方案,这只是我想要实现的语法的一个示例。 问题答案: 我知道这个问题很旧,但是有些评论是新的,尽管所有可行的解决方案本质上都是相同的,但大多数解决方案都不是很干净也不易于阅读。 就像thobe的回答所说,处理这两

  • 问题内容: 我正在尝试创建一个以验证以下日期时间: 我已经尝试使用以下日期时间格式化程序来验证上述日期: 它适用于所有上述日期罚款,但根据我的要求就应该失败的。 注意:我知道使用以下格式化程序可以达到预期的结果: 但是我想知道,通过改变我们可以达到预期的结果吗? 为了解析日期,我使用以下方法: 问题答案: 您必须创建一个可选部分(使用和方法),该部分包含小数点后跟1至6位数字: 这将从解析,并引发