بيثون المزيد من المتاعب في استيراد الوحدات النمطية
-
21-09-2019 - |
سؤال
لقد طرحت سؤالًا مشابهًا بالأمس ، لكنني اكتسبت مشكلة غريبة حقًا منذ ذلك الحين. مع هيكل الدليل هذا:
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