البرمجة

فهم أخطاء الاستيراد النسبي في بايثون

في عالم لغة البرمجة بايثون، تواجهنا أحيانًا بتحديات تتعلق بنظام الاستيراد وهياكل الملفات. تظهر لديك الآن خطأ “ValueError: attempted relative import beyond top-level package”، وسأقدم لك شرحًا مفصلًا لهذا الخطأ وكيفية حله.

هذا الخطأ يشير إلى محاولة استيراد نسبي تتجاوز الحزمة على أعلى مستوى. لفهم هذا الخطأ بشكل أفضل، دعنا نلقي نظرة على هيكل الملفات الخاص بك.

لديك هيكل الملفات التالي:

css
pkg/ __init__.py c.py d.py subpkg/ __init__.py a.py b.py

وفي a.py لديك الكود التالي:

python
from . import b from .. import d

ثم في c.py لديك:

python
import subpkg.a

الخطأ ينشأ بسبب السطر:

python
from .. import d

عند محاولة استيراد d من الحزمة الأب pkg. لكن هذا يعتبر استيرادًا نسبيًا يتجاوز الحزمة على أعلى مستوى (pkg). حتى وإن كان لديك ملف __init__.py في الحزمة pkg، فإن الحزمة subpkg تفصل بينها وبين pkg، ولا يمكن استخدام الاستيراد النسبي هنا.

لحل هذه المشكلة، يمكنك تنظيم هيكل الملفات الخاص بك بشكل مختلف. على سبيل المثال، يمكنك استخدام الاستيراد المطلق بدلاً من النسبي أو تغيير تنظيم الملفات لتجنب هذا النوع من الأخطاء.

لتحسين الفهم حول هذه المشكلة، يمكن أن يكون من المفيد فحص كيف يعمل الاستيراد في بايثون بشكل عام ومتى يجب استخدام الاستيراد النسبي أو المطلق.

المزيد من المعلومات

بالطبع، دعونا نعمق أكثر في فهم كيفية عمل الاستيراد في لغة البرمجة بايثون وكيف يمكن تجنب مشكلة الاستيراد النسبي في هذا السياق.

في بايثون، يتم استخدام الاستيراد لتحميل واستخدام الوحدات (modules) والحزم (packages) من ملفات أخرى. الاستيراد يعتمد على مفهومين رئيسيين: الاستيراد المطلق والاستيراد النسبي.

الاستيراد المطلق يتم باستخدام اسم الوحدة أو الحزمة بشكل كامل دون الرجوع إلى الموقع في الهيكل الأشجاري للملفات. على سبيل المثال:

python
import pkg.subpkg.a

هنا، يتم استيراد a من subpkg الكائنة ضمن الحزمة pkg، ويكون الاستيراد مطلقًا.

أما بالنسبة للاستيراد النسبي، فيتم استخدام النقط للإشارة إلى موقع الوحدة أو الحزمة بالنسبة للملف الحالي. لكن، كما تجد الآن في ملف a.py:

python
from .. import d

هنا، يحدث الاستيراد النسبي، حيث يشير .. إلى الحزمة الأب pkg. ولكن هذا يكون مشكلًا إذا كنت تحاول استيراد من خلال حزمة فرعية (subpkg)، حيث يعتبر استيراد d كمحاولة لاستيراد خارج الحزمة.

لتجنب هذه المشكلة، يمكنك استخدام الاستيراد المطلق أو إعادة هيكلة الملفات بحيث لا تكون هناك حاجة للاستيراد النسبي في هذا السياق. قد يكون من الأفضل وضع ملف c.py في الحزمة subpkg لتجنب هذا الصعوبات في الاستيراد.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر