سؤال

خبراء بدون تكديس ،

لقد تمكنت من إنشاء مهام تحت الثعبان بدون تكديس (سواء من الجانب المكدس والجانب C).

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

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

لسوء الحظ ، تتضمن حالة الاستخدام الخاصة الخاصة بي إنشاء مهمة من جانب C (C ++) ، ويرتبط (محتمل يحتمل أن يحظر) Python قابلة للاتصال والتي لها قيمة إرجاع مهمة لاستخدامها لاحقًا. يبدو أن كتابة وظيفة التنظيف الدقيقة على الجانب C ليست ممكنة للغاية ، حيث لم أجد طريقة لتحويل وظيفة C إلى قابلة للاتصال ببيوكسور ديناميكيًا (لا تنطوي على تهيئة جدول الوحدة ، وما إلى ذلك) ، واستخدام بدون جنسية لا أساس لها وظيفة C (أفترض أن النموذج الأولي يجب أن يكون pyobject*(pyobject*، pyobject*)) هي عمومًا فكرة سيئة في ظل عالم C ++ على أي حال.

يبدو أن واجهة برمجة تطبيقات Clowlly أيضًا لا تحتوي على وظيفة مناسبة لاسترداد قيمة الإرجاع للم تكتبليلي. هل هو الخيار الوحيد الذي يجب أن أكتبه وظيفة micromanaging المذكورة أعلاه (استطاع كن حكوميًا) في بيثون ، وقم بتوفير وسيلة لاسترداد قيمة الإرجاع المحفوظة في مكان ما (بطريقة مفيدة ، أي عدم استخدام المتغيرات العالمية)؟ أو يمكن أن يكون هناك خيارات أخرى يمكنني استكشافها؟

شكرا جزيلا لك،

لين

PS أنا أفهم أنه في البرمجة C وبرمجة مستوى نظام التشغيل ، تكون قيمة الإرجاع لوظيفة مؤشر الترابط ذات مغزى فقط لرمز الخروج ، وستكون وظائف مؤشر الترابط نموذجًا أوليًا صارمًا ، على سبيل المثال ، يجب أن تلتزم وظائف بعض القواعد الصارمة بحيث يمكن تشغيلها AS/بواسطة موضوع. والآن نتحدث عن بيثون :)

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

المحلول

من موقع Stackless.com:

"... لكنني لم أر بعد وسيلة لاسترداد قيمة الإرجاع للتشغيل القابل للاتصال المرتبط بمثابة مهتم. ..."

لا أعرف أن هناك واحدة.

"... قيمة الإرجاع المهمة لاستخدامها لاحقًا. يبدو أن كتابة وظيفة التنظيف الدقيقة على الجانب C ليست ممكنة للغاية ، لأنني لم أفعل ..."

إن أبسط طريقة للقيام بذلك هي تحديد رمز دالة Python الغلاف في C كسلسلة ، وتجميعها في كائن دالة يمكنك تشغيله كمهتم. مثال على ذلك ، تتبع وظيفة Python ، الجزء C الذي أتركه لك.

على سبيل المثال

  def RunFunctionAndGetResult(chan, func, *args, **kwargs):
      chan.send(func(*args, **kwargs))

هتافات،

ريتشارد.

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