كيف يمكنني تنفيذ التعليمات البرمجية بشكل مشروط في كتلة "مع"؟

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

  •  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)): داخل حاول / باستثناء كتلة. لكنني لا أنصح القيام بذلك.

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