2009-12-28 4 views
1

Pour le code:Pourquoi pas mon impression de code `os.path`

def a(x): 
    if x=='s': 
     __import__('os') #I think __import__ == import 
     print os.path 

Pourquoi ne pas print a('os') impression os.path?


Ma question suivante est: Pourquoi l'utilisation de code suivant __import__('some') au lieu de quelque chose comme, a = __import__('os')?

def import_module(name, package=None): 
    if name.startswith('.'): 
     if not package: 
      raise TypeError("relative imports require the 'package' argument") 
     level = 0 
     for character in name: 
      if character != '.': 
       break 
      level += 1 
     name = _resolve_name(name[level:], package, level) 
    __import__(name)   #Why does it do this 
    return sys.modules[name] #Instead of `return __import__(name)` 
+1

Pourquoi vous essayez d'utiliser __ __ importation du tout? –

+1

Y at-il un problème avec l'utilisation d'un "os d'importation" en haut du fichier? – Pod

Répondre

5

@ réponse de statictype.org est correct (__import__ ne lie aucun nom dans l'espace de noms local), mais pourquoi voulez-vous imprimer <module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/posixpath.pyc'> ou quelque chose d'aussi bizarre selon votre plate-forme?! C'est ce que print os.path fera une fois que vous avez corrigé votre bug - essayez-vous accomplir par cela ?!

Vous êtes sûr de ne pas vouloir quelque chose de complètement différent tel que print os.environ['PATH'] ou print os.getcwd() ...?

Modifier: pour répondre à la suite sur la question de l'OP:

__import__(name)#why it do this 
return sys.modules[name] 

__import__ n'installe ce qui dans l'importation sys.modules; cela vaut mieux que

return __import__(name) 

si name contient un ou plusieurs . s (points): dans ce cas, __import__ renvoie le haut niveau le module, mais sys.modules a la vraie chose. Par exemple:

return __import__('foo.bar') 

est équivalent à

__import__('foo.bar') 
return sys.modules['foo'] 

pas comme on pourrait penser à

__import__('foo.bar') 
return sys.modules['foo.bar'] 
+0

salut alex, j'ai mis à jour les exemples, s'il vous plaît aidez-moi à regarder – zjm1126

+0

ainsi, '__ import__' doit être le nom différent, parce que '__import__' Impossible de distinguer 'a.txt', 'a.py' ou 'a.rar', oui ?, merci – zjm1126

+0

'__import__' importe un module Python, donc un' .py' (ou un '.pyd' [[sur Win; '.so' sous Linux]], ou un' .pyc' directement, si existant et mis à jour), ** jamais ** un '.txt' ou' .rar'. –

11

__import__ renvoie un module. Il n'ajoute rien à l'espace de noms actuel.

Vous voulez probablement simplement utiliser import os:

def a(x): 
    if x=='s': 
     import os 
     print os.path 
a('s') 

Alternativement, si vous souhaitez importer le module comme une chaîne, vous pouvez attribuer explicitement:

def a(x): 
    if x=='s': 
     os = __import__('os') 
     print os.path 
a('s') 
+0

hi @ statictype.org, j'ai mis à jour les exemples, s'il vous plaît aidez-moi à jeter un oeil – zjm1126

Questions connexes