我正試圖通過使用裝飾器來減少SLOC。我有一個案例,我需要啓動四個TCP服務器並將連接客戶端保存爲全局變量。這是代碼。在Python中使用裝飾器來設置全局變量
# The sockets we will be using
socket0_client = None
socket1_client = None
socket2_client = None
socket3_client = None
# Populate them
def save_client(global_client_var):
def decorator(func):
async def inner(client, verbose=False):
global_client_var = client
# Receive stuff
with client:
while True:
# Get data. If there is no data, quit
data = await loop.sock_recv(client, 10000)
if not data:
break
# respond to the data
await func(client, data)
return inner
return decorator
@save_client(socket0_client)
async def socket0_reply(client, data):
await loop.sock_sendall(client, b'Got:'+data)
@save_client(socket1_client)
async def socket1_reply(client, data):
await loop.sock_sendall(client, b'Got:'+data)
@save_client(socket2_client)
async def socket2_reply(client, data):
await loop.sock_sendall(client, b'Got:'+data)
@save_client(socket3_client)
async def socket3_reply(client, data):
await loop.sock_sendall(client, b'Got:'+data)
loop.create_task(tcp_server.single_server(('', 60001), task=socket0_reply, verbose=True))
loop.create_task(tcp_server.single_server(('', 60002), task=socket1_reply, verbose=True))
loop.create_task(tcp_server.single_server(('', 60003), task=socket2_reply, verbose=True))
loop.create_task(tcp_server.single_server(('', 60004), task=socket3_reply, verbose=True))
有一個函數,我沒有代碼。它是single_server功能。它綁定到給定地址的服務器,等待連接,然後在新連接的客戶端上調用任務。
我的問題是,儘管客戶端在內部函數中填充,並且顯然設置爲global_client_var,但全局套接字從不設置。他們仍然沒有。
這是怎麼回事?我怎樣才能得到這些全局變量?
爲什麼不只是聲明'socket0_client'在功能全球'socket0_reply'然後將它們設置爲客戶端呢? – Skycc
,因爲在從套接字接收數據之前,不會調用該代碼。我希望能夠在數據收到之前在別處使用套接字。 – jrk0414