2009-02-15 8 views
7

En C++, vous pouvez souvent améliorer considérablement la lisibilité de votre code par l'utilisation minutieuse de la « utilisant » mot-clé, par exemple:Est-ce que python a quelque chose comme C++ utilisant un mot-clé?

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

devient

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

Est-ce que quelque chose exist similaire pour python, ou dois-je complètement qualifier tout? Je vais ajouter l'avertissement que je sais que l'utilisation a ses pièges et il devrait être de portée limitée.

Répondre

19

Comme dit Bill, Python a le construction

from X import * 

mais vous pouvez aussi spécifier explicitement les noms que vous voulez à partir du module importé (namespace):

from X import foo, bar, blah 

Ceci tend à rendre le code encore plus lisible/plus facile à comprendre, puisque quelqu'un voyant un identifiant de la source ne n Il est nécessaire de parcourir tous les modules importés pour voir d'où il vient. Voici une question connexe: Namespace Specification In Absence of Ambuguity

EDIT: en réponse au commentaire de Pax, je vais mentionner que vous pouvez également écrire des choses comme

import X.foo 

mais vous aurez besoin d'écrire

X.foo.moo() 

au lieu de simplement

foo.moo() 

Ce n'est pas nécessairement une mauvaise chose, bien sûr. J'utilise généralement un mélange des formes from X import y et import X.y, quoi que je ressente rend mon code le plus clair. C'est certainement une chose subjective dans une certaine mesure.

+0

Vous pourriez vouloir étendre ceci pour inclure «importer X» qui vous permet alors d'utiliser X.y choses de ce module. Je préfère parfois cela pour réduire la pollution de l'espace de noms. – paxdiablo

+0

Bon appel, fait ;-) –

+1

Pourquoi "contrairement à C++"? Vous ne pouvez pas utiliser "using std :: string;"? – Constantin

6
import X 

ou

from X import * 

ou

from X import a, b, c 

Où X est le module Python que vous souhaitez utiliser.

Il serait utile que vous nous donniez un échantillon de code Python que vous pensez avoir besoin d'être nettoyé.

5

Bien sûr, le dynamisme de Python rend cela trivial. Si vous aviez une classe enfoui au plus profond dans un espace de noms: foo.bar.baz.blah, vous pouvez faire:

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

Notez que

from foo import bar 

fonctionne même si bar est un module dans le package foo.Cela vous permet de limiter la pollution de votre espace de noms sans devoir nommer chaque fonction/classe dans foo.bar que vous pourriez utiliser. Il aide également les lecteurs de votre code, car ils verront un appel à bar.baz() et auront une meilleure idée d'où vient baz.

1

En plus de la réponse de David:

  1. On devrait utiliser entre parenthèses dans from X import (foo, bar, blah) pour un bien de PEP8.
  2. La syntaxe complète permet de renommer (relier) les noms de packages à leurs nouveaux identifiants dans la portée du module en cours, comme dans from foo import bar as baz.

Je vous recommande de consulter le manuel du import keyword, le __import__ intégré et explication sys.modules en lecture plus.