بيثون المزيد من المتاعب في استيراد الوحدات النمطية

StackOverflow https://stackoverflow.com/questions/2290595

سؤال

لقد طرحت سؤالًا مشابهًا بالأمس ، لكنني اكتسبت مشكلة غريبة حقًا منذ ذلك الحين. مع هيكل الدليل هذا:

app/
    models/
        __init__.py
        user.py
        other.py
    pages/
        __init__.py
        pages.py

يحتوي ملف النماذج/__ init__.py على هذا السطر:

__all__ = ['user', 'other']

والصفحات/__ init__.py لديها

__all__ = ['pages']

في Pages.py ، من أجل استخدام أي من الفئات في user.py أو other.py ، يجب أن يكون لدي

from models import *
import models

في الأعلى ، ثم يمكنني إعلان أ User فئة مثل هذا:

my_user = models.user.User()

إذا استبعدت أي من عبارات الاستيراد في الأعلى ، فأنا أحصل على أخطاء مثل

"Class user has no attribute User"

سيكون موضع تقدير أي مساعدة. أنا أحب Python ، لكني أتمنى أن تكون وظائف الاستيراد تعمل بشكل أكثر شبهاً بـ PHP.

هل كانت مفيدة؟

المحلول

هناك خياران ، اعتمادًا على المكان الذي تريد أن تكون فيه صريحًا ومقدار ما تريد "افتراضيًا" (وهو ما يعني أيضًا قسريًا).

في ملفات __init__ التي يمكنك استخدامها:

# models/__init__.py shown:
import user, other                 # ambiguous relative import
from . import user, other          # relative import
from app.models import user, other # absolute import

أو ، حيث كان لديك خلاف ذلك فقط import models, ، استعمال:

from models import user, other
# or:
import models.user, models.other

النموذج الأخير مفضل على نطاق واسع.

نصائح أخرى

الشيء الوحيد الذي يمكن أن يكون مفيدًا حقيقيًا عندما تتعلم بيثون (أو تصحيح الأخطاء) ، هو الركض بشكل تفاعلي واستخدام dir() تعمل لمعرفة ما يعيش فيه:

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__']
>>> import models
>>> dir(models)
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
>>> models.user
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'user'
>>> from models import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'models', 'other', 'user']
>>> dir(models)
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__','__path__', 'other', 'user']
>>> user
<module 'models.user' from 'C:\test\models\user.py'>
>>> models.user
<module 'models.user' from 'C:\test\models\user.py'>
>>> user.User
<class 'models.user.User'>

تحديث: الإخراج الثابت.

import models.user
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top