2012-05-10 1 views
1

J'ai le code suivant:Comment accéder aux noms de niveau module en Python?

import m 

def f(m=None): 
    if m is None: 
     k = m.M() # I want this m to refer to the imported module, not the parameter 

Je voudrais vraiment préférer garder les deux le nom du paramètre et le nom du module même. Y a-t-il un moyen de se référer explicitement au module m?

Répondre

2

Si vous ne me dérange pas de changer le nom du module que dans le module d'importation, vous pouvez faire:

import m as m_ 

def f(m=None): 
    if m is None: 
     k = m_.M() 
1

Si vous avez besoin du paramètre le même que le nom du module d'habitude , pour la lisibilité du code, mais peut tolérer le module temporairement renommé pour ce champ, vous pouvez faire quelque chose comme ceci:

import m as _m 

def f(m=None): 
    if m is None: 
     k = _m.M() 

Pas idéal, mais probablement le plus proche, vous pouvez obtenir.

1

un module en python est juste un autre objet, de sorte que le globals() -builtin fonctionnera bien:

import m 

def f(m=None): 
    if m is None: 
     k = globals()['m'].M() 
-2

Vous pouvez définir la valeur par défaut du paramètre m pour être l'attribut du module, comme ceci:

import m 

def f(m=m.M): 
    m() 

Cependant, une observation globale (le nom du module) avec un paramètre n'est pas la façon la plus Pythonic de le faire. Plus pythoniquement, vous nommerez le paramètre M, qui correspond à la méthode M qu'il va agir comme.

import m 

def f(M=m.M): 
    M() 

De cette façon, vous pouvez toujours vous référer aux autres attributs du module si vous en avez besoin.

+0

? Ce n'est pas une bonne solution. – mata

+0

puis vous le transmettez et il remplace la valeur DEFAULT dans la définition de la fonction. –

+0

no. lier un module à un paramètre comme valeur par défaut juste pour pouvoir l'utiliser dans la fonction n'est tout simplement pas quelque chose que vous faites. essayez d'expliquer ce paramètre à quelqu'un utilisant votre module. la seule raison de le faire serait si vous aimeriez pouvoir passer dans un objet différent pour changer ce que fait la fonction. – mata

0

Si c'est dans cette seule fonction où le conflit de nom se produit, vous pouvez toujours réimporter le module dans la portée de la fonction et le renommer pour éviter l'ambiguïté.

import m 

def f(m=None): 
    import m as the_real_m 
    if m is None: 
     k = the_real_m.M() 

Le m en import m as the_real_m peut être un peu déroutant, mais ici il est pas une référence variable donc il n'y a pas de problème avec elle à résoudre la mauvaise chose. Personnellement, je préfère renommer l'argument de la fonction, mais je me rends compte avec des arguments de mots-clés le nom de l'argument peut faire partie de l'interface exposée à d'autres parties du système, et garder le nom le plus clair possible peut être plus important. Et si vous voulez passer quelque chose d'autre à la fonction

Questions connexes