- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
编辑:我目前误解了该功能。 It's not designed for multiple dispatch :
NOTE: While it would be possible to provide a multiple dispatch implementation using this syntax, its implementation would require using sys._getframe() , which is frowned upon. Also, designing and implementing an efficient multiple dispatch mechanism is hard, which is why previous attempts were abandoned in favor of functools.singledispatch() . (See PEP 443 , especially its section "Alternative approaches".) In the future we may come up with a satisfactory multiple dispatch design, but we don't want such a design to be constrained by the overloading syntax defined for type hints in stub files. It is also possible that both features will develop independent from each other (since overloading in the type checker has different use cases and requirements than multiple dispatch at runtime -- e.g. the latter is unlikely to support generic types).
====
我离开 Java 已经有一段时间了,现在我要回到 Python 3.5。我想使用新的类型提示功能,但我在方法重载方面遇到了麻烦。从我对该功能的阅读来看,这应该得到支持。
这是我正在做的一个快速的小类(class):
licensing.pyi(注意pyi)
import typing
import gitlab
class LicensingChecker(object):
@typing.overload
def __init__(self, url: str, api_key: str) -> None: ...
@typing.overload
def __init__(self, gl: gitlab.Gitlab) -> None: ...
def iter_projects(self) -> typing.Iterator[str]: ...
licensing.py
import gitlab
import string
class LicenseChecker(object):
def __init__(self, gl):
self.gl = gl
def __init__(self, url, api_key):
self.gl = gitlab.Gitlab(url, api_key)
def iter_projects(self):
p = set()
for i in string.ascii_lowercase:
for x in self.gl.projects.search(i):
if x not in p:
p.add(x)
yield x.name
这是一个玩具示例,但这个想法相当传统。我提供了两个构造函数,一个采用现有的 gitlab 客户端,另一个将实例化它。 (此脚本不需要双重构造函数,但我看到了 @typing.overload
并想看看它是如何工作的。)
Pycharm 和 Cpython 似乎对这段代码很满意,但第一个构造函数是不可访问的——就像 @typing.overload
装饰器不起作用:
>>> import gitlab
>>> import licensing
>>> licensing.LicenseChecker(gitlab.Gitlab('https://blah.blah.blah/gitlab', 'hunter2'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'api_key'
我必须做一些特别的事情才能使重载工作吗?目前,我只是调用内置的 REPL 或 ipython。
最佳答案
Untyped Python 不支持重载。您的第二个 __init__
正在覆盖第一个,因此是错误。您需要编写一个带有运行时类型检查的 __init__
:
def __init__(self, arg1, arg2=None):
if isinstance(arg1, gitlab.Gitlab) and arg2 is None:
self.gl = arg1
elif arg1 is not None and arg2 is not None:
self.gl = gitlab.Gitlab(arg1, arg2)
else:
raise TypeError('........')
(有functools.singledispatch
可以模拟只有一个参数改变类型的重载,但它不适合你的情况)
@typing.overload
装饰器只是告诉类型检查器参数可以有多种组合,这并不意味着您现在可以在两个不同的同名函数中编写实现。来自 PEP 484 :
Uses of the
@overload
decorator as shown above are suitable for stub files. In regular modules, a series of@overload
-decorated definitions must be followed by exactly one non-@overload
-decorated definition (for the same function/method). The@overload
-decorated definitions are for the benefit of the type checker only, since they will be overwritten by the non-@overload
-decorated definition, while the latter is used at runtime but should be ignored by a type checker.
关于python - 3.5 : Type Hinting and Method Overloading,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37553551/
考虑以下因素: let container = document.getElementById('container'); let inp = container.querySelector('#my
假设我们有一些函数 func映射类 A 的实例类的实例 B ,即它有签名 Callable[[A], B] . 我想写一个类装饰器autofunc对于 A 的子类自动应用 func在创建实例时。例如,
我有一个类通过预定的执行程序来安排任务。 我希望在 TimeUnit 上对类进行参数化。我的意思是我希望能够为线程池构造具有延迟等的类,以及一种指定 TimeUnit 的方法,例如如果是秒/毫秒/分钟
关于 cppreference关于map::emplace_hint() : template iterator emplace_hint( const_iterator hint, Args&&.
我在我的 html 中添加了一个 mat-hint 元素。我只想在用户关注相应的表单字段时显示 mat-hint 并隐藏 focusout 上的提示。如何为所有表单字段实现此方案。 Max 5
虽然以下代码确实使用鼠标所在单元格的文本正确设置了 Form1.Caption,但它不会显示任何 DBGrid.Hint 除非我单击该单元格。 这张图有什么问题吗? type THackGrid =
我是 ORM 解决方案的倡导者,并且不时举办关于 Hibernate 的研讨会。 在谈论框架生成的 SQL 时,人们通常会开始谈论他们需要如何使用“提示”,而这在 ORM 框架中被认为是不可能的。 通
我有以下设置:我正在使用 PHPUnit 模拟非抽象类,但不是它的所有方法。因此,非模拟方法仍然作为对模拟中真实方法的调用而存在。 问题是:如何暗示这些方法可用(当然,具有正确的签名)? 我会详细说明
嗨,谁能帮助我了解如何在 mongo 聚合查询中使用“提示”,现在我正在使用下面的代码来查询结果。 AggregationOptions options = AggregationOptions.bu
我有一个简单的拼字游戏。我已经搞砸了,但现在我想添加一个“提示”系统。我不知道如何显示元组中的 1 个项目。我有 2 个元组,我想根据第一个元组是什么从第二个元组中提取。我有一个 WORD=("x",
如何在 Hint.css 中应用手动换行符提示? 我几乎尝试了一切:, \n,以及它们的组合。 我也在 CSS 中尝试了一些东西: white-space: normal; word-wrap: br
我正在尝试使用 hint.css在我的注册表中,但它不起作用,工具提示与其他标签一起工作正常,但不适用于 标签这是我的 html 部分: Hello 演示 here 或者请建议任何支持输入标签
我正在使用 HINT.css对于工具提示,我不能为了上帝的爱得到工具提示来扩展内容。我试过清除固定,设置高度等等,但无济于事。基本上我想说: &:after content: attr
在PyCharm Code completion > "Basic Completion"> "Invoke Basic Completion"> "Dictionaries"我看到,如果您将字典硬编
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to change the filename displayed in the “Save as…”
这个问题在这里已经有了答案: How to make an Android Spinner with initial text "Select One"? (36 个答案) 关闭 6 年前。 数据库
在 Live Photos 部分下的 iOS 人机界面指南中,Apple 是这样说的, "Make sure that users can distinguish a Live Photo from
在进行套接字编程时,人们总是这样命名 addrinfo 结构: struct addrinfo hints; // get ready to connect status = getaddrinfo(
Python 想必大家都已经很熟悉了,甚至关于它有用或者无用的论点大家可能也已经看腻了。但是无论如何,它作为一个广受关注的语言还是有它独到之处的,今天我们就再展开聊聊 Python。 Python
概述 从PHP5开始,我们可以使用类型提示来指定定义函数时,函数接收的参数类型。如果在定义函数时,指定了参数的类型,那么当我们调用函数时,如果实参的类型与指定的类型不符,那么PHP会产生一个致命级
我是一名优秀的程序员,十分优秀!