web-dev-qa-db-fra.com

python: deux modules et classes du même nom sous différents packages

J'ai commencé à apprendre le python et à écrire une application pratique. La structure du répertoire ressemble à

src
 |
 --ShutterDeck
    |
    --Helper
       |
       --User.py -> class User
    --Controller
       |
       --User.py -> class User

Le répertoire src est dans PYTHONPATH. Dans un fichier différent, disons main.py, je veux accéder aux deux classes User. Comment puis-je le faire.

J'ai essayé d'utiliser les éléments suivants, mais cela échoue:

import cherrypy
from ShutterDeck.Controller import User
from ShutterDeck.Helper import User

class Root:
  @cherrypy.expose
  def index(self):
    return 'Hello World'

u1=User.User()
u2=User.User()

C'est certainement ambigu. L’autre façon (c ++ de le faire) à laquelle je peux penser est 

import cherrypy
from ShutterDeck import Controller
from ShutterDeck import Helper

class Root:

  @cherrypy.expose
  def index(self):
    return 'Hello World'

u1=Controller.User.User()
u2=Helper.User.User()

Mais quand le script ci-dessus est exécuté, il donne l'erreur suivante

u1=Controller.User.User()
AttributeError: 'module' object has no attribute 'User'

Je ne suis pas capable de comprendre pourquoi c'est une erreur Les répertoires ShutterDeck, Helper et Controller ont __init__.py en eux.

18
Mayank

Vous souhaitez importer les modules User dans les fichiers du package __init__.py pour les rendre disponibles en tant qu'attributs.

Donc, dans Helper/__init_.py et Controller/__init__.py, ajoutez:

from . import User

Cela fait du module un attribut du paquet et vous pouvez maintenant vous y référer en tant que tel.

Sinon, vous devez importer les modules eux-mêmes dans leur intégralité:

import ShutterDeck.Controller.User
import ShutterDeck.Helper.User

u1=ShutterDeck.Controller.User.User()
u2=ShutterDeck.Helper.User.User()

alors référez-vous à eux avec leurs noms complets.

Une autre option consiste à renommer le nom importé avec as:

from ShutterDeck.Controller import User as ControllerUser
from ShutterDeck.Helper import User as HelperUser

u1 = ControllerUser.User()
u2 = HelperUser.User()
31
Martijn Pieters

Une façon est juste:

import ShutterDeck.Controller.User
import ShutterDeck.Helper.User

cuser = ShutterDeck.Controller.User.User()
huser = ShutterDeck.Helper.User.User()

Vous pouvez aussi faire ceci:

from ShutterDeck.Controller.User import User as ControllerUser
from ShutterDeck.Helper.User import User as HelperUser
4
Andrew Gorcester

Cela pourrait aussi aider (aux prises avec un problème similaire aujourd'hui):

ShutterDeck
├── Controller
│   ├── __init__.py
│   └── User.py
├── Helper
│   ├── __init__.py
│   └── User.py
└── __init__.py

dans ShutterDeck/{Controller,Helper}/__init__.py:

from .User import User

Et alors:

>>> import ShutterDeck.Helper
>>> helperUser = ShutterDeck.Helper.User()
>>> helperUser
<ShutterDeck.Helper.User.User object at 0x1669b90>
>>> import ShutterDeck.Controller
>>> controllerUser = ShutterDeck.Controller.User()
>>> controllerUser
<ShutterDeck.Controller.User.User object at 0x1669c90>
1
jaor