2009-02-15 9 views
7

En C++ a menudo se puede mejorar drásticamente la legibilidad del código por el uso cuidadoso de la palabra clave "usando", por ejemplo:¿Python tiene algo así como la palabra clave de C++?

void foo() 
{ 
    std::vector< std::map <int, std::string> > crazyVector; 
    std::cout << crazyVector[0].begin()->first; 
} 

convierte

void foo() 
{ 
    using namespace std; // limited in scope to foo 
    vector< map <int, string> > crazyVector; 
    cout << crazyVector[0].begin()->first; 
} 

sí existe algo similar para pitón, o ¿Tengo que calificar completamente todo?

Agregaré la cláusula de exención de responsabilidad que sé que el uso tiene sus peligros y debe tener un alcance limitado.

Respuesta

19

Como dijo Bill, Python tiene la construcción

from X import * 

pero también se puede especificar explícitamente qué nombres que desee importar desde el módulo (espacio de nombres):

from X import foo, bar, blah 

Esto tiende a hacer que el código sea más legible incluso/más fácil de entender, ya que alguien viendo un identificador en la fuente no hace n Buscaremos todos los módulos importados para ver de dónde viene. Aquí hay una pregunta relacionada: Namespace Specification In Absence of Ambuguity

EDITAR: en respuesta al comentario de Pax, voy a mencionar que también se puede escribir cosas como

import X.foo 

pero entonces tendrá que escribir

X.foo.moo() 

en lugar de sólo

foo.moo() 

Esto no es necesariamente algo malo, por supuesto. Usualmente uso una mezcla de los formularios from X import y y import X.y, todo lo que siento hace que mi código sea más claro. Ciertamente es algo subjetivo hasta cierto punto.

+0

Es posible que desee expandir esto para incluir "importar X" que luego le permite usar X.y cosas de ese módulo. A veces prefiero que esto reduzca la contaminación del espacio de nombres. – paxdiablo

+0

Buena llamada, hecho ;-) –

+1

¿Por qué "a diferencia de C++"? ¿No puedes usar "using std :: string"? – Constantin

6
import X 

o

from X import * 

o

from X import a, b, c 

Donde X es el módulo de Python que desea utilizar.

Sería útil que nos proporcione una muestra del código Python que cree que necesita ser limpiada.

5

Claro, el dinamismo de Python hace que esto sea trivial. Si usted tenía una clase enterrado profundamente en un espacio de nombres: foo.bar.baz.blah, que puede hacer:

def foo: 
    f = foo.bar.baz.blah 
    f1 = f() 
0

Tenga en cuenta que

from foo import bar 

funciona incluso si bar es un módulo en el paquete foo.Esto le permite limitar la contaminación de su espacio de nombres sin tener que nombrar cada función/clase en foo.bar que le pueda interesar usar. También ayuda a los lectores de su código, ya que verán una llamada al bar.baz() y tendrán una mejor idea de dónde vino el baz.

1

Además de la respuesta de David:

  1. Se debe utilizar paréntesis en from X import (foo, bar, blah) para un bien de PEP8.
  2. La sintaxis completa permite cambiar el nombre (volver a vincular) los nombres de paquete a sus nuevos identificadores dentro del alcance del módulo actual como en from foo import bar as baz.

me recomiendan para buscar el manual para el import keyword, la __import__ incorporado y explicación de sys.modules como lectura adicional.

Cuestiones relacionadas