باستخدام مع - كيفية معرفة المتغيرات الموجودة في السياق

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

  •  12-12-2019
  •  | 
  •  

سؤال

في كود كيفي هذا:

class MyPaintWidget(Widget):
    def on_touch_down(self, touch):
        userdata = touch.ud
        with self.canvas:
            Color(1, 1, 0)
            d = 30.
            Ellipse(pos=(touch.x - d/2, touch.y - d/2), size=(d, d))
            userdata['line'] = Line(points=(touch.x, touch.y))

فيما يبدو Color و d و Ellipse تقع ضمن مساحة الاسم self.canvas, ولكن كيف تعرف بايثون ذلك؟ userdata ليس ضمن نفس مساحة الاسم؟

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

المحلول

تحرير:هذا الجواب حصلت قليلا طويلة, حتى هنا هو موجز:

  1. with self.canvas يحدد حاليا نشط قماش التالية كتلة التعليمات البرمجية.
  2. جميع تعليمات الرسم مثل Color أو Ellipse رسم على النشطة قماش.

مساحات حقا لم يكن لديك أي شيء للقيام مع انها سياق هذه المسائل (انظر أدناه).

على with بيان يتيح لك استخدام ما يسمى السياق مديري.

بناء الجملة هو مثل هذا

with thing [as foo]:

حيث thing وعادة ما هي وظيفة مزينة contextlib.contextmanager الديكور.ماذا بالضبط سياق مدير لا يعتمد على كيفية thing يتم تنفيذها.

ولكن ما لا يفعله هو متغير تظهر بطريقة سحرية في النطاق الخاص بك.في إشارة إلى السياق يمكن الحصول عليها عن طريق الاختياري as foo شرط, لكن هذا كل شيء. Color و Ellipse في المثال الخاص بك تأتي من مكان آخر (ربما الواردات؟).

من أجل معرفة ماذا بالضبط سياق مدير في with self.canvas خط لا يجب أن ننظر في وثائق API أو التعليمات البرمجية المصدر بالنسبة kivy.graphics.instructions.Canvas.

هنا مقتطفات ذات الصلة من البرنامج التعليمي:

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

لذلك استخدام من Color و Ellipse يؤثر self.canvas, لكنهم لا يعرف في أي طريقة من قبل مع البيان.

ابحث في التعليمات البرمجية المصدر ، هذا هو كيف يعمل:

def class CanvasBase(InstructionGroup):
    def __enter__(self):
        pushActiveCanvas(self)

    def __exit__(self, *largs):
        popActiveCanvas()

__enter__ و __exit__ تحديد ماذا يحدث إذا كان سياق مدير دخلت (قبل أول خط بادئة الرمز بعد with بيان) وخرجت.

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

في kivy.graphics.instructions.Instruction, الظاهر الفئة الأساسية لجميع تعليمات الرسم ، الأم هي مجموعة نشطة حاليا قماش:

self.parent = getActiveCanvas()

نصائح أخرى

في الحقيقة، Color و Ellipse يتم استيرادها من kivy.graphics أعلى قليلاً في الكود:

from kivy.graphics import Color, Ellipse

للإجابة على سؤالك حول مساحات الأسماء، لا تحتاج بايثون إلى "معرفة" مساحة الاسم التي تحصل على المتغيرات منها على الإطلاق.لديها قواعد مساحة اسم بسيطة جدًا مقارنة بلغات مثل Java، والتي تبحث عن وظيفة، وكائن، وفئة، وعمومية، ونطاقات الحزم واحدًا تلو الآخر.تحتوي Python على مساحة اسم عامة واحدة (لكل وحدة) ومجموعة من مساحات الأسماء المحلية (على سبيل المثال.يمكن للوظائف المتداخلة الحصول على المتغيرات من الوظائف الخارجية).إنه ينتقل فقط إلى أسفل قائمة النطاقات حتى يجد اسم المتغير المعني.

ال with البيان أعلاه له معنى خاص، ولكن أعتقد حتى with لا يمكن إدخال متغيرات جديدة ضمنيًا في النطاق المحلي (يمكنه تقديم متغير واحد بشكل صريح مع as شرط ولكن).

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