سؤال

تكرار ممكن:
طريقة سهلة للتحقق من أن المتغير محدد في بيثون؟
كيف يمكنني التحقق مما إذا كان هناك متغير في بيثون؟

كيف تعرف ما إذا كان قد تم تعيين متغير في مكان معين في الكود في وقت التشغيل؟ هذا ليس واضحًا دائمًا لأنه (1) يمكن ضبط المتغير بشكل مشروط ، (2) يمكن حذف المتغير بشكل مشروط. أنا أبحث عن شيء مثل defined() في بيرل أو isset() في PHP أو defined? في روبي.

if condition:
    a = 42

# is "a" defined here?

if other_condition:
    del a

# is "a" defined here?
هل كانت مفيدة؟

المحلول

try:
    thevariable
except NameError:
    print("well, it WASN'T defined after all!")
else:
    print("sure, it was defined.")

نصائح أخرى

'a' in vars() or 'a' in globals()

إذا كنت تريد أن تكون متحمسًا ، فيمكنك التحقق من المدمج أيضًا
'a' in vars(__builtins__)

أعتقد أنه من الأفضل تجنب الموقف. من الأنظف وأكثر وضوحًا أن تكتب:

a = None
if condition:
    a = 42
try:
    a # does a exist in the current namespace
except NameError:
    a = 10 # nope

موقف واحد محتمل حيث قد تكون هناك حاجة إلى ذلك:

إذا كنت تستخدم finally حظر لإغلاق الاتصالات ولكن في try كتلة ، يخرج البرنامج مع sys.exit() قبل تحديد الاتصال. في هذه الحالة ، finally سيتم استدعاء Block وسوف تفشل بيان إغلاق الاتصال نظرًا لعدم إنشاء أي اتصال.

لهذه الحالة بالذات ، من الأفضل القيام بذلك a = None بدلاً من del a. سيؤدي هذا إلى تقليل عدد المرجع إلى الكائن a كان (إن وجد) تم تعيينه ولن يفشل عندما a غير محدد. لاحظ أن del البيان لا يطلق على Destructor لكائن ما مباشرة ، ولكن قم بإلغاء ربطه من المتغير. يتم استدعاء Destructor of Object عندما أصبح عدد المرجع صفرًا.

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