输入提示:解决循环依赖

时间:2015-11-20 23:46:08

标签: python type-hinting python-3.5

以下产生var allDataTbl = $('#all-data-tbl').DataTable( { bFilter: false, dom: 'Bfrtip', buttons: [ 'copy', { extend: 'excel', title: 'BC Run of River Decision Support Tool' }, { extend: 'csv', title: 'BC Run of River Decision Support Tool' } ] } ); request.done(function(mapInfo) { var arr = []; $.each(mapInfo, function(i,v) { arr.push($.map(v, function(v1) { return v1; })); }); allDataTbl.clear().rows.add(arr).draw(); )}; 。我该如何解决?

NameError: name 'Client' is not defined

2 个答案:

答案 0 :(得分:53)

您可以使用字符串名称为尚未定义的Client类使用forward reference

class Server():
    def register_client(self, client: 'Client')
        pass

As of Python 3.7,您还可以通过在模块顶部添加以下__future__导入来推迟所有运行时解析注释:

from __future__ import annotations

此时注释被存储为表达式的抽象语法树的字符串表示;您可以使用typing.get_type_hints()来解决这些问题(并解决上面使用的转发引用)。

有关详细信息,请参阅PEP 563 -- Postponed Evaluation of Annotations;此行为将是Python 4.0中的默认行为。

答案 1 :(得分:1)

如果您使用的是Python 3.7+,请在另一个答案中使用from __future__ import annotations as mentioned。但是,如果由于操作系统限制而不能使用3.7(例如截至2019-06-03的Cygwin),则可以使用typing模块来满足这些类型的前向/循环依赖问题。

请原谅人为的例子,但这应该说明此方法的有用性。

from typing import TypeVar, Generic

T_Server = TypeVar('T_Server')
T_Client = TypeVar('T_Client')


class Server(Generic[T_Server]):
    clients: list = None

    def __init__(self):
        self.clients=[]

    def register_client(self, client: T_Client) -> None:
        self.clients.append(client)
        print('Client `%s` registered with server' % client.name)

    def print_clients(self) -> None:
        for i, client in enumerate(self.clients):
            print('client %i: %s' % (i, client.name))

    @staticmethod
    def build_clone(server: T_Server) -> T_Server:
        svr_new: Server = Server()
        for client in server.clients:
            svr_new.register_client(client)
        return svr_new

class Client():
    name: str = None
    def __init__(self, name: str, server: T_Server):
        self.name = name
        server.register_client(self)


svr = Server()
cli = Client('foo', svr)
svr.print_clients()

svr_clone = Server.build_clone(svr)
svr_clone.print_clients()