- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
让我们假设我们需要一个函数,它接受任何类型的两个参数,只要两个参数具有相同的类型即可。您将如何使用 mypy 对其进行静态检查?
如果我们只需要函数接受一些有限数量的已知类型,这很容易:
from typing import TypeVar, List, Callable
T = TypeVar('T', int, str, List[int], Callable[[], int])
def f(a: T, b: T) -> None:
pass
f(1, 2)
f("1", "2")
f([1], [2])
f(lambda: 1, lambda: 2)
f(1, "2") # mypy will print an error message
对于这段代码,mypy 可以确保 f
的参数是两个 int
或两个 str
或两个 int
或两个返回 int
的零参数函数。
但是如果我们事先不知道类型怎么办?如果我们需要类似于来自 F# 和 OCaml 的 let f (a:'t) (b:'t) = ()
怎么办?简单地写 T = TypeVar('T')
会让 f(1, "2")
有效,这不是我们想要的。
最佳答案
你要求的是不可能的(见下文解释)。但通常情况下,python 中不需要要求两个参数具有完全相同的类型。
在您的示例中,int
、str
、List[int]
、Callable[[]、int]
没有任何共同的方法或属性(除了任何两个 object
实例所具有的),所以除非你用 isinstance
手动检查类型,否则你不能真正用你的论点做任何你不能用 object
实例做的事情。你能解释一下你的用例吗?
Mypy 类型系统有子类型。因此,当您编写 f(a, b)
时,mypy 仅检查 a
和 b
的类型是否都是 T< 的子类型
而不是恰好等于 T
。
此外,mypy 子类型系统大多是预定义的,不受程序员控制,特别是每个类型都是 object
的子类型。 (IIUC,在 OCaml 中,程序员需要明确说明哪些类型应该处于子类型关系中,因此默认情况下每个类型约束都是相等约束。这就是为什么你可以在 OCaml 中做你想做的事)。
所以,当你写的时候
T = TypeVar('T')
f(a: T, b: T) -> None: ...
f(x, y)
您只是在告诉 mypy x
和 y
的类型必须是某些常见类型 T
的子类型。当然,通过推断 T
是 object
,这个约束总是(简单地)得到满足。
更新
对于你在评论中的问题(是否可以确保 y
的类型是 x
类型的子类型?),答案也是否定的。
即使 mypy
允许一个类型变量从上面被指定的类型绑定(bind),这个绑定(bind)不能是另一个类型变量,所以这不会工作:
T = TypeVar('T')
U = TypeVar('U', bound=T, contravariant=True) # error, T not valid here
f(x: T, y: U) -> None
关于python - 如何在不明确列出类型的情况下确保参数具有相同的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40033093/
简而言之:我想从可变参数模板参数中提取各种选项,但不仅通过标签而且通过那些参数的索引,这些参数是未知的 标签。我喜欢 boost 中的方法(例如 heap 或 lockfree 策略),但想让它与 S
我可以对单元格中的 excel IF 语句提供一些帮助吗? 它在做什么? 对“BaselineAmount”进行了哪些评估? =IF(BaselineAmount, (Variance/Baselin
我正在使用以下方法: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
我正在使用 CodeGear RAD Studio IDE。 为了使用命令行参数测试我的应用程序,我多次使用了“运行 -> 参数”菜单中的“参数”字段。 但是每次我给它提供一个新值时,它都无法从“下拉
我已经为信用卡类编写了一些代码,粘贴在下面。我有一个接受上述变量的构造函数,并且正在研究一些方法将这些变量格式化为字符串,以便最终输出将类似于 号码:1234 5678 9012 3456 截止日期:
MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号? 我已经像平常一样创建了经典 ASP 代码,但我没有更新该列。 我需要引用 VarChar 参数吗?
给出了下面的开始,但似乎不知道如何完成它。本质上,如果我调用 myTest([one, Two, Three], 2); 它应该返回元素 third。必须使用for循环来找到我的解决方案。 funct
将 1113355579999 作为参数传递时,该值在函数内部变为 959050335。 调用(main.c): printf("%d\n", FindCommonDigit(111335557999
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭9年前。 public class StackOve
我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。 1 =
我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
rails 新手。按照多态关联的教程,我遇到了这个以在create 和destroy 中设置@client。 @client = Client.find(params[:client_id] || p
通过将 VM 参数设置为 -Xmx1024m,我能够通过 Eclipse 运行 Java 程序-Xms256M。现在我想通过 Windows 中的 .bat 文件运行相同的 Java 程序 (jar)
我有一个 Delphi DLL,它在被 Delphi 应用程序调用时工作并导出声明为的方法: Procedure ProduceOutput(request,inputs:widestring; va
浏览完文档和示例后,我还没有弄清楚 schema.yaml 文件中的参数到底用在哪里。 在此处使用 AWS 代码示例:https://github.com/aws-samples/aws-proton
程序参数: procedure get_user_profile ( i_attuid in ras_user.attuid%type, i_data_group in data_g
我有一个字符串作为参数传递给我的存储过程。 dim AgentString as String = " 'test1', 'test2', 'test3' " 我想在 IN 中使用该参数声明。 AND
这个问题已经有答案了: When should I use "this" in a class? (17 个回答) 已关闭 6 年前。 我运行了一些java代码,我看到了一些我不太明白的东西。为什么下
我输入 scroll(0,10,200,10);但是当它运行时,它会传递字符串“xxpos”或“yypos”,我确实在没有撇号的情况下尝试过,但它就是行不通。 scroll = function(xp
我是一名优秀的程序员,十分优秀!