代码之家  ›  专栏  ›  技术社区  ›  jrk0414

在python中使用修饰符设置全局变量

  •  0
  • jrk0414  · 技术社区  · 8 年前

    # 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函数。它绑定到给定地址的服务器,等待连接,然后在新连接的客户机上调用任务。

    这是怎么回事?如何设置这些全局变量?

    1 回复  |  直到 8 年前
        1
  •  0
  •   joemeilinger    8 年前

    您不能更新Python函数参数所指向的引用,而这正是您的代码试图做的。Python中的所有函数调用参数都是通过值传递的;然而,你 能够 在这种情况下,将项附加到传入列表或字典:

    sockets = {}                                                                     
    
    # Populate them                                                                            
    def save_client(global_client_var):                                                        
        def decorator(func):                                                                   
            async def inner(client, verbose=False):                                            
                sockets[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(0)                                                               
    async def socket0_reply(client, data):                                                     
        await loop.sock_sendall(client, b'Got:'+data)                                          
    @save_client(1)                                                               
    async def socket1_reply(client, data):                                                     
        await loop.sock_sendall(client, b'Got:'+data)                                          
    @save_client(2)                                                               
    async def socket2_reply(client, data):                                                     
        await loop.sock_sendall(client, b'Got:'+data)                                          
    @save_client(3)                                                               
    async def socket3_reply(client, data):                                                     
        await loop.sock_sendall(client, b'Got:'+data)