2011-07-14 21 views
5

a.pyKorzystanie zmiennej globalnej jako domyślną parametru

#!c:/Python27/python.exe -u 

from connection import Connection 
import globals 

globals.server_ip = '192.168.0.1' 
connection = Connection() 

globals.py

#!c:/Python27/python.exe -u 

server_ip = '127.0.0.1' 

connection.py

import globals 

class Connection:   
    def __init__(self, server_ip = globals.server_ip): 
     print 'Connection is ' + server_ip + '\n' 

spodziewałem I wi Otrzymam wydruk Connection is 192.168.0.1. Zamiast tego drukowany jest numer Connection is 127.0.0.1.

ile staram się budować połączenia przez przechodzącą w parametrze w sposób jawny (co nie jest coś, co chcą, a ja niechętnie dokonać zmiany dłużej Połączenie z 0 parametru)

connection = Connection(globals.server_ip)

Dlaczego tak jest? Czy mogę zastosować inne techniki?

Odpowiedz

10
def __init__(self, server_ip=globals.server_ip): 

Argument jest powiązany, gdy metoda jest tworzona i nie jest ponownie obliczana później. Aby użyć co jest aktualna wartość, użyć czegoś takiego:

def __init__(self, server_ip=None): 
    if server_ip is None: 
     server_ip = globals.server_ip 

BTW, z dokładnie tego samego powodu funkcja jak to mogłoby nie działać zgodnie z przeznaczeniem:

def foobar(foo=[]): 
    foo.append('bar') 
    return foo 

W kodzie o krytycznym działaniu to zachowanie może być również używane do uniknięcia globalnych wyszukiwań wbudowanych:

Powiązane problemy