【问题标题】:Type hinting for class defined in a function函数中定义的类的类型提示
【发布时间】:2022-01-22 01:55:26
【问题描述】:

我们正在向我们的代码库添加类型提示,并且有一种特殊情况我不知道如何进行正确的类型提示。我们有一个函数,如果它还不存在,它将创建一个特定类的实例。它创建对象的类在函数本身中定义,以使其成为单例。以下代码中给出了此类函数的示例:

__GREETER = None

def get_greeter():
   global __GREETER

   class Greeter:
       def greet_user(name: str):
           print(f'Hello {name}')

   if not __GREETER:
       __GREETER = Greeter()

   return __GREETER

我现在想知道如何为 get_greeter() 函数的返回类型添加类型提示。我可以只使用get_greeter() -> 'Greeter' 还是应该做一些不同的事情?

注意,自 python 3 以来确实有更简洁的方法来定义单例,但重构是积压的事情。

【问题讨论】:

  • 如果您将Greeter 类移出get_greeter 函数,则解决方案变得微不足道。 “我可以使用...” - 不(你试过了吗?)。
  • 无论如何,鉴于您当前的代码,我不知道有什么方法可以注释 get_greeter 的返回类型,因为函数外部不知道返回类型。
  • 我认为 OP 正试图将班级锁定。 Python 不符合约定和协作,它不是 Java
  • 我没有看到将类放入函数中的任何特殊原因。每次调用 get_greeter 时,它都会被重新定义(不必要地)。只需将类定义放在函数之外。
  • @soetaertie 一旦调用了get_greeter,任何人都可以创建Greeter 的实例:f = get_greeter(); g = type(f)()

标签: python type-hinting


【解决方案1】:

我建议对您的代码进行轻微重构,使其成为更通用的方法。即使您公开您的类,您也可以使单例模式适用。例如。见下文。

class Greeter:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super(Greeter, cls).__new__(cls)
        return cls._instance

    def greet_user(name: str):
        print(f'Hello {name}')

您可以重新编写 Greeter 类,以确保它是单例的。现在为了向后兼容,请保持原来的方法。

def get_greeter() -> Greeter:
    return Greeter()

它只创建一个实例。你的提示也实现了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-06
    • 2016-10-16
    • 2011-03-02
    • 2021-08-27
    • 2021-11-16
    • 2022-08-18
    相关资源
    最近更新 更多