微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在函数python中编写类实例的返回类型

如何解决如何在函数python中编写类实例的返回类型

我正在动态加载模块,并且我想要以下函数的返回类型的类型提示

def get_cls_instance_dynamically(website_name: str):
    ''' returns an instance of a class based on website name'''
    
    # Ignore below 2 lines of code if unable to understand. It just returns module
    # e.g. from websites import google (Here 'google' will be dynamically loaded)
    website_class_name = website_name.title()

    website_module = __import__(f"websites.{website_name}",fromlist=[website_class_name])

    website_cls = getattr(website_module,website_class_name)
    return website_cls()

目录结构:

websites
 |- google.py   # contains class 'Google'
 |- twitter.py  # contains class 'Twitter'

我的问题是如何定义 get_cls_instance_dynamically 类的返回类型。每个网站类可能有不同的方法

用法: 如果我使用 get_cls_instance_dynamically('google'),那么它应该返回 Google 中存在的 templates/google.py 类的实例,并带有类型提示

问候。

解决方法

很难为返回类型在运行时确定的函数提供有用的类型提示。

有意义的上下文是几种类型共享一个公共 API,因此您可以在其中任何一个 API 上调用该 API 中的方法,而无需实际关心当前对象的特定类型是什么。如果您的各种 websites.foo.Foo 对象都是这种情况,那么您应该使类型提示指示共享 API。这可能是一个公共基类(例如某种类型的 Website 类),或者可能是您在函数旁边定义的 typing.Protocol(如果您的类型检查器支持 PEP 544)。

但是,如果没有通用 API,我建议根本不要暗示返回类型。调用代码需要提前知道对于给定的输入字符串将获得什么类型,因此它可以将自己的类型提示放在存储返回值的变量上:

my_goog: websites.google.Google = get_cls_instance_dynamically('google')
my_goog.some_google_specific_method()

当然,这可能表明动态对象创建函数不是很有用,因为如果代码需要知道它想要创建什么类型的对象,它可以自己创建正确类型的对象(例如my_goog = websites.google.Google()) 而不是调用函数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。