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

支持__getitem__的类的Python类型提示

张姚石
2023-03-14
问题内容

我想向函数添加类型提示,该函数将接受带有__getitem__方法的任何对象。例如,在

def my_function(hasitems, locator):
    hasitems[locator]

我不想限制hasitems为特定类型,例如listdict。只要它支持__getitem__,它就是的适当参数my_function。如何在没有不必要限制的情况下注释其类型?

编辑:显然,PyCharm可以在许多常见情况下得出适当的提示,但在我的实际用例中却不能。我无法发布代码,因为它是用于工作的,而且我找不到PyCharm失败的非专有最小示例。无论如何,原始问题不会引用PyCharm,它仍然是类型提示的有效用例。


问题答案:

如果你愿意安装一个不很-官方扩展typing,打字的扩展,您可以使用Protocol,这应该是一个实现PEP-0544:

from typing_extensions import Protocol
from typing import Any

class GetItem(Protocol):
    def __getitem__(self: 'Getitem', key: Any) -> Any: pass

class BadGetItem:
    def __getitem__(self, a: int, b: int) -> Any: pass

def do_thing(arg: GetItem):
    pass

do_thing(dict())  # OK
do_thing(BadGetItem())  # Fails with explanation of correct signature
do_thing(1)  # Fails


 类似资料:
  • 很长一段时间以来,我一直在使用python机器人来完成一些工作任务。其中,机器人必须通过身份验证窗口。 python程序中的代码如下: 但昨天它抛出了这个错误: 硒。常见的例外情况。WebDriverException:消息:不支持promptUserAndPass类型的用户提示 我一直在谷歌搜索,但我甚至没有找到关于这种异常以及如何处理这个问题的结果。 有什么想法吗? 提前感谢!

  • lint Description:参考sqlint格式,以插件形式集成到代码编辑器,显示输出更加友好 Example: soar -report-type lint -query test.sql markdown Description:该格式为默认输出格式,以markdown格式展现,可以用网页浏览器插件直接打开,也可以用markdown编辑器打开 Example: echo "select

  • 问题内容: 很长时间以来,我一直在使用python机器人来完成一些工作任务。除其他外,机器人必须通过身份验证窗口。 python程序中的代码如下: 但是昨天它抛出了这个错误: selenium.common.exceptions.WebDriverException:消息:不支持使用提示用户类型提示用户提示 我一直在搜索,但是我什至找不到关于这种异常以及如何处理该问题的结果。 有任何想法吗? 提前

  • 谷歌云SQL提供的所有数据类型是什么? 我正在迁移一个数据库,所以我想知道谷歌云支持的数据类型。如果有任何官方链接,请提供。

  • 问题内容: 在PEP 484中 ,包含模块的类型提示已添加到Python 3中。在Python 2中有什么方法可以做到这一点?我能想到的就是有一个装饰器来添加到检查类型的方法中,但这将在运行时失败,并且不会像提示所允许的那样被较早地捕获。 问题答案: 根据 Python 2.7的建议语法和 定义类型提示的PEP 484中的 跨代码 ,存在与Python 2.7兼容的另一种语法。但是,它不是强制性的

  • 问题内容: 我有以下代码: 然后工作正常: 但这不是: 引发TypeError。 我发现新型类在__dict__类而不是实例__dict__中寻找魔术方法。这是正确的吗?为什么会这样呢?您是否知道任何文章解释了背后的想法?我尝试过RTFM,但可能不是正确的方法,或者没有抓住问题… 非常感谢你!保罗 问题答案: 这在Python数据模型文档中进行了介绍:新型类的特殊方法查找: 对于新型类,只有在对对