返回内部类的实例

时间:2017-12-26 10:31:26

标签: python python-3.x typing

我的界面定义为:

class IDefaultedRepo(IRepository):
    """Represents defaulted table in DB"""

    def get_values_by_legalbdr(self, legalbdr: str):    
        raise NotImplementedError

但是,这还不够明确,因为我不知道返回了哪些字段。 我希望有类似的东西:

class IDefaultedRepo(IRepository):
    """Represents defaulted table in DB"""

    def get_values_by_legalbdr(self, legalbdr: str)->IDefaultedRepo.Result:
       class Result(object):
            def __init__(self, terminal, value, container):
                self.terminal = terminal
                self.value = value
                self.container = container

        raise NotImplementedError

但是这会抛出一个NameError,因为还没有定义Result类。 有没有办法指定函数的返回类型(以便内部成员可以通过点.运算符访问),而无需为每个函数显式创建结果类?

编辑我没有在他们自己的模块中定义,因为我认为会有太多的尴尬和冗长的名字。定义一个内部类会更好,因为它不会强制每次都发明一个新的类名,因为返回类型特定于它所做的函数(?)只能将定义的范围限制在这个函数中。但是,看起来我必须在一个单独的模块中定义它们

1 个答案:

答案 0 :(得分:0)

问题不在于Result未定义,而是IDefaultedRepo未定义,解决方法是使用字符串。请参阅this密切相关的问题。但是,在您的情况下,永远不会定义IDefaultedRepo.Result,因为您的“内部”类根本不是内部类,它是函数的本地类。如果你真的想要一个内部类,你需要在类体内定义类,而不是在函数体内。

这样的事情:

In [1]: class IRepository: pass

In [2]: class IDefaultedRepo(IRepository):
   ...:     """Represents defaulted table in DB"""
   ...:
   ...:     class Result:
   ...:         def __init__(self, terminal, value, container):
   ...:             self.terminal = terminal
   ...:             self.value = value
   ...:             self.container = container
   ...:
   ...:     def get_values_by_legalbdr(self, legalbdr: str)->'IDefaultedRepo.Result':
   ...:        raise NotImplementedError
   ...:

这不是我的第一个倾向,但是......

但以下检查了mypy

class IRepository: pass

class IDefaultedRepo(IRepository):
    """Represents defaulted table in DB"""

    class Result:
        def __init__(self, terminal, value, container):
            self.terminal = terminal
            self.value = value
            self.container = container

    def get_values_by_legalbdr(self, legalbdr: str)->'IDefaultedRepo.Result':
       raise NotImplemented

class MyIDefaultRepo(IDefaultedRepo):
    def get_values_by_legalbdr(self, legalbdr: str)->'IDefaultedRepo.Result':
        class MyResult(IDefaultedRepo.Result):
            pass
        return MyResult('foo','bar','baz')