2010-02-06 24 views
7

Tome este código:¿Cuál es una alternativa más agradable a un _replace namedtuples?

>>> import urlparse 
>>> parts = urlparse.urlparse('http://docs.python.org/library/') 
>>> parts = parts._replace(path='/3.0'+parts.path) 

parts._replace works pero como es un método subrayada, se supone que debe ser interna, y no se utiliza. ¿Hay una alternativa? No quiero hacer:

>>> parts = parts[:2] + ('/3.0'+parts.path,) + parts[3:] 

Debido a que hace una tupla ordinaria, y no un namedtuple, y haciendo:

>>> parts = namedtuple(scheme=parts.scheme, netloc=parts.netloc, etc etc) 

es un poco estúpido. :)

Ideas?

Respuesta

19

La razón por la cual los métodos de namedtuple comienzan con un guión bajo inicial es solo para evitar colisiones de nombres. Ellos should not be considered to be for internal use only:

Para evitar conflictos con los nombres de los campos, el método y los nombres de los atributos comienzan con un guión bajo.

+0

Ahaaaa ......... –

+0

yo sepa nunca hubo un PEP para 'namedtuple', donde se podría argumentar que sufijación * * un guión sería más apropiado (a la' class_') sólo para evitar tales malentendidos. – tzot

+1

El sufijo puede haber sido una mejor opción aunque no funcionaría bien con la opción rename = True. FWIW, el código namedtuple fue ampliamente revisado y discutido antes del lanzamiento. La construcción de la receta fue un esfuerzo de la comunidad (ver http://code.activestate.com/recipes/500261-named-tuples/) y se sometió a una revisión y revisión adicional en python-dev. –

Cuestiones relacionadas