以下产生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
答案 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()