2011-07-14 10 views
5

a.pyvariable global como parámetro por defecto

#!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' 

me esperaba que wi Obtendré la impresión de Connection is 192.168.0.1. Pero, en su lugar, se está imprimiendo Connection is 127.0.0.1.

A menos trato de construir la conexión al pasar en el parámetro de forma explícita (que no es algo que deseo, ya que soy reacio a hacer el cambio más en conexión con el parámetro 0)

connection = Connection(globals.server_ip)

¿Por qué esto es tan? ¿Hay alguna otra técnica que pueda aplicar?

Respuesta

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

El argumento está vinculado cuando se crea el método y no se vuelve a evaluar más adelante. Para utilizar cualquiera que sea el valor de la corriente, usar algo como esto:

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

Por cierto, por exactamente la misma razón una función como esta sería probable que no funcionen como se pretende:

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

En código de rendimiento crítico, este comportamiento también se puede utilizar para evitar las búsquedas globales de construcciones internas:

def highspeed(some_builtin=some_builtin): 
    # in here the lookup of some_builtin will be faster as it's in the locals 
Cuestiones relacionadas