كيف يمكنني تنفيذ التعليمات البرمجية بشكل مشروط في كتلة "مع"؟
-
05-07-2019 - |
سؤال
أعتقد أن هذا يسيء إلى نوع ما ، لكنني ما زلت فضوليًا سواء كان يمكن القيام به - أريد أن أفعل شيئًا مثل:
with conditional(a):
print 1
بحيث print 1
يتم تنفيذ الجزء فقط إذا كان a==True.هل هذا ممكن؟
يحرر:كما يقول الناس أدناه، هذا أسلوب فظيع.إنه مجرد لغز/سؤال.لا تجرب هذا في المنزل، وليس لضعاف القلوب وما إلى ذلك.
المحلول
لا يوجد سبب حقيقي للقيام بذلك، نظرًا لأنه تم توفير الشروط الشرطية بالفعل باستخدام if
إفادة:
if a == True:
print 1
ولكن، إذا كنت تطلب فقط هزار, ، الجواب هو لا يمكنك حقًا.لوقف with
المحتوى من التنفيذ، conditional
سوف تحتاج إلى وقف التنفيذ بطريقة أو بأخرى، في __enter__
طريقة.ولكن الطريقة الوحيدة للقيام بذلك هي رفع استثناء، مما يعني أنه لن يتم تشغيل أي تعليمات برمجية أخرى، إلا إذا قمت بلف ملف with
مع try
بيان للتعامل مع الحالات a != True
يحرر: أرى أنني تمت محاكمتي في التعليقات والتصويتات لاستخدام شرط البروتوكول الاختياري (a == True
) فكرت في تغييره إلى if a
, ، وهو بالطبع المصطلح في بايثون لاختبار الشروط الشرطية.ولكننا لا أعلم ما كان يدور في ذهن OP، وما إذا كان يريد ذلك حقًا a
أن يكون منطقيًا، ولا يريد تنفيذ الحظر إذا a = [1]
(الذي سوف يمر if a
) أنا قررت ترك الأمر كما هو.
نصائح أخرى
if a is True:
print 1
والمقصود with
بيان لتوفير موثوقية دخول -exit السياق.
والطريقة الوحيدة التي يمكنني رؤية هو رفع استثناء في conditional
إذا حجتها هي كاذبة. لن يتم تنفيذ الجسم with
، ولكن لا إرادة أي من التعليمات البرمجية التالي - حتى شرط except
أو finally
، بالطبع
ودعونا نقول لدي فئة A مع __enter__ وظيفة __exit__:
class A:
def __init__(self, i):
self.b = i
def __exit__(*args, **kwargs):
print "exit"
def __enter__(*args, **kwargs):
print "enter"
وظيفة B من شأنها أن تحقق إذا ب في الكائن ج يساوي 1 إلا فإنه سوف تمر.
def b(c):
if c.b == 1:
return c
else:
pass
وأستطيع تحقيق ما يلي:
with b(A(1)):
print 10
enter
10
exit
ولكن سوف رمي AttributeError إذا مرت ب ك <م> مع م> لن يكون لها أي شيء للعمل مع.
ومن شأن حل هو وضع with b(A(1)):
داخل حاول / باستثناء كتلة. لكنني لا أنصح القيام بذلك.