【问题标题】:Python type hinting to return class in functionPython类型提示在函数中返回类
【发布时间】:2017-04-02 06:37:11
【问题描述】:

我有一个类似于下面的功能。我希望类型提示返回 Bar 但这似乎是无效的。有没有办法做到这一点,还是我必须将类移到函数之外才能将其作为返回类型引用?

def foo(i: int) -> Bar:
    class Bar:
        def __init__(i: int):
            self.i = i
    return Bar(i)

【问题讨论】:

    标签: python-3.x type-hinting


    【解决方案1】:

    注释没有意义,因为您的函数每次调用时都会返回一个不同的新Bar的实例。

    换句话说,没有一个 Bar 类可供您检查类型。 type(foo(1)) is type(foo(2)) 的结果总是错误的,所以当你传入 foo(2) 时,对 type(foo(1)) 的类型检查总是会失败。

    如果你想在这里应用类型检查,你需要声明一个基类:

    class BaseBar: pass
    
    def foo(i: int) -> BaseBar:
        class Bar(BaseBar):
            def __init__(i: int):
                self.i = i
        return Bar(i)
    

    为了使其更具可读性,可以将基类命名为Bar,而函数可以生成BarImplConcreteBar 或类似名称。这样您就可以在任何地方的类型注释中继续使用 Bar 以减少混淆。

    您实际上似乎并不需要每次都创建一个新类;类中没有任何内容被参数化或使用闭包;如果这对您的实际代码是正确的,那么您可以在函数外部定义它:

    class Bar:
        def __init__(i: int):
            self.i = i
    
    def foo(i: int) -> Bar:
        return Bar(i)
    

    【讨论】:

    • 我什至没有想到我每次都在创建一个新课程。我只是想防止命名空间混乱,但如果这是正确的,我会通过将类移动到其他地方并从那里调用它来获得更好的性能。
    • @Ajurna:绝对。 class ...: 语句是一个可执行语句。它在 Python 遇到它时立即执行。模块在首次导入时执行,然后将生成的类对象存储在全局级别。这里你将它创建为函数中的局部变量,每次调用函数时都会执行。
    猜你喜欢
    • 2020-01-25
    • 2014-03-06
    • 2022-01-16
    • 2015-11-23
    • 2022-12-22
    • 1970-01-01
    • 2019-11-21
    • 2017-05-26
    • 2017-04-03
    相关资源
    最近更新 更多