如何在函数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'),那么它应该返回templates/google.py中存在的带有类型提示的Google类的实例。

谨致问候。

对于在运行时确定返回类型的函数,很难给出有用的类型提示。

有意义的上下文是多个类型共享一个公共的API,因此您可以在其中任何一个上调用该API中的方法,而不必关心当前对象的具体类型。如果各种websites.foo.Foo对象都是这种情况,则应使类型提示指示共享的API。这可能是一个公共基类(例如某种类型的Website类(,也可能是您在函数旁边定义的typing.Protocol(如果您的类型检查器支持PEP544(。

然而,如果没有常见的API,我建议不要暗示返回类型。调用代码需要提前知道给定的输入字符串的类型,因此它可以在存储返回值的变量上放置自己的类型提示:

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

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

相关内容

最新更新