यदि कोई चर मौजूद है तो मैं कैसे जांच करूं?


953

मैं जाँच करना चाहता हूँ कि क्या कोई चर मौजूद है। अब मैं कुछ ऐसा कर रहा हूं:

try:
   myVar
except NameError:
   # Do something.

क्या अपवाद के बिना अन्य तरीके हैं?


15
अपवाद के साथ क्या गलत है?
एस.लॉट

10
@ S.Lott: अगर myVarकुछ वास्तव में जटिल है, तो tryधीमी गति से चीजों का उत्पादन / मूल्यांकन करने में लंबा समय लगता है ?
dbliss

3
@ डब्लिस: यह एक चर है। कुछ अजीब मामलों के अलावा यदि आप कुछ पागल execया मेटाक्लस के साथ कर रहे हैं , तो यह महंगा नहीं होगा।
user2357112

एक और पूरा जवाब: stackoverflow.com/a/1592578/1661797
nickboldt

जवाबों:


1626

स्थानीय चर के अस्तित्व की जांच करने के लिए:

if 'myVar' in locals():
  # myVar exists.

वैश्विक चर के अस्तित्व की जांच करने के लिए:

if 'myVar' in globals():
  # myVar exists.

यह जाँचने के लिए कि किसी वस्तु में कोई विशेषता है:

if hasattr(obj, 'attr_name'):
  # obj.attr_name exists.

29
ठीक है, और मैं कक्षा में मौजूदा विशेषता की जांच कैसे कर सकता हूं?
मैक्स फ्राई

7
और आप चर का नाम कैसे बदल सकते हैं जो संभवतः एक स्ट्रिंग में मौजूद नहीं है?
साइलेंटगॉस्ट

15
लेकिन ओपी कोड टाइप कर रहा है, वे myVar के 'myVar' को टाइप कर सकते हैं। यदि कोड लिखे जाने पर चर नाम ज्ञात नहीं है, तो इसे रनटाइम पर एक स्ट्रिंग चर में संग्रहीत किया जाएगा, और मैंने जो चेक पोस्ट किया है वह भी काम करेगा।
अयमान हुइह्र

8
इसमें अंतर्निहित चर भी हैं, और, यदि आपके पास नेस्टेड फ़ंक्शन हैं, तो बाहरी स्कोप में चर। यदि आप उन सभी के लिए जांचना चाहते हैं, तो आप शायद NameErrorसभी के बाद ट्रिगर करना सबसे अच्छा कर रहे हैं ।
पेट्र विक्टोरिन

14
मुझे सबसे अच्छा लगा if hasattr(obj, 'attr_name'):जो कक्षाओं के लिए भी काम करता है:if hasattr(self, 'attr_name'):
रॉन कलियन

118

जिन चरों का उपयोग अभी तक परिभाषित या सेट (स्पष्ट या स्पष्ट रूप से) किया गया है, लगभग हमेशा किसी भी भाषा में एक बुरी चीज है , क्योंकि यह अक्सर इंगित करता है कि कार्यक्रम के तर्क को ठीक से नहीं सोचा गया है, और परिणाम की संभावना है अप्रत्याशित व्यवहार में।

आप अगर जरूरत अजगर में यह करने के लिए, निम्न चाल है, जो तुम्हारा के समान है, यह सुनिश्चित करना होगा एक चर है कि कुछ उपयोग करने से पहले मूल्य:

try:
    myVar
except NameError:
    myVar = None

# Now you're free to use myVar without Python complaining.

हालांकि, मुझे अभी भी यकीन नहीं है कि यह एक अच्छा विचार है - मेरी राय में, आपको अपने कोड को फिर से भरने की कोशिश करनी चाहिए ताकि यह स्थिति उत्पन्न न हो।


8
हो सकता है कि यह एक निर्भरता का एक चर है, और संस्करण / प्लेटफ़ॉर्म के लिए रिकॉर्डिंग करना मौजूद हो सकता है या नहीं, और यह जानने का कोई अन्य तरीका नहीं है कि यह क्या संस्करण है।
WhyNotHugo

35
असाइन किए जाने से पहले राज्य चर मौजूद नहीं होते हैं - यदि आप पिछली स्थिति से वर्तमान स्थिति तक एक रेखा खींचते हैं, तो पिछला = वर्तमान सेट करें, इसका मतलब यह नहीं है कि आप पहली कॉल पर "अपने चर नहीं जानते"। और ड्रॉ रूटीन के बाहर पिछले = अशक्त को शुरू करने के लिए कोड की एक अतिरिक्त लाइन लिखने का मतलब यह नहीं है कि आप "अपने चर को जानें" बेहतर है।
डेव

4
मेरा कहना है कि एक ब्लॉक "यदि अंतिम: ड्रा (अंतिम, वर्तमान); अंतिम = वर्तमान" को समझना आसान है और खराब प्रोग्रामिंग नहीं है। "कोड" के अस्तित्व की जाँच करने में सक्षम होने से पहले "अंतिम /" को जोड़ने से पहले यह उस कोड की पठनीयता से अलग हो जाता है।
डेव

23
"जिन चरों का उपयोग परिभाषित नहीं किया गया है, वे वास्तव में किसी भी भाषा में एक बुरी बात है" मुझे कृपालु भाषण दें। हममें से कुछ लोग सरल गणित या सांख्यिकी लिपियों के लिए पाइथन का उपयोग आईडीई का उपयोग करते हैं जैसे कि स्पाइडर जो कि मैटलैब की तरह काम करता है। यह उन वातावरणों में कभी-कभी समझ में आता है कि उपयोगकर्ता को ग्लोबल कंसोल में वेरिएबल को परिभाषित करने की अनुमति दें और जांच करें कि क्या वे स्क्रिप्ट में अघोषित हैं जैसे गणित में गणित करते समय।
रिकार्डो क्रूज़

15
@ रेकार्डो, शायद, यह कंडेन्सेशन मानने के बजाय, आप कम से कम इस संभावना पर विचार करना चाह सकते हैं कि यह किसी ऐसे व्यक्ति से अच्छी सलाह है जो अधिक जानकार हो सकता है :-) या क्या आप इसे समान रूप से संरक्षण मानेंगे यदि मैंने वैश्विक स्तर पर उपयोग के खिलाफ सलाह दी हो चर, स्पेगेटी कोड, देव वस्तुएं, अप्रयुक्त कोड जारी करना, या COBOL में ऑपरेटिंग सिस्टम लिखना? मेरे उत्तर ने कहा कि मुझे क्यों लगा कि यह एक बुरा विचार था (और ओपी ने सोचा कि यह आवश्यक क्यों है, यह इंगित करने वाले प्रश्न में कुछ भी नहीं था), लेकिन फिर भी उन्होंने उस बंद मौके पर एक रास्ता प्रदान किया जो वे वास्तव में करना चाहते थे।
paxdiablo

52

एक सरल तरीका यह है कि इसे पहली बार में कहा जाए myVar = None

फिर बाद में:

if myVar is not None:
    # Do something

2
इस उत्तर में बहुत कुछ सुधार किया जाना है। बल्कि - एक सरल तरीका यह है कि पहले इसे घोषित किया जाए। myVar = none # do stuff... if not myVar: # give myVar a value myVar = 'something'
शॉन मेहन

मुझे यह बहुत पसंद है क्योंकि मैंने अपने exceptबयानों में किसी को भी कुछ नहीं दिया
HashRocketSyntax

ऐसा क्यों नहीं है: if myVar: # Do something यह एक दोहरे नकारात्मक पढ़ने की आवश्यकता से बचता है
jjisnow

@jjisnow क्योंकि आप चाहते हैं कि यह स्थिति myVarएक खाली सूची, शून्य, खाली स्ट्रिंग आदि के बावजूद भी सच हो
गेब्रियल

7
myjar घोषित नहीं होने पर @jjnownow python3 में if myVar: # Do somethingफेंकता NameErrorहै
Agile Bean

25

एक चर के अस्तित्व के लिए परीक्षण करने के लिए प्रयास / छोड़कर का उपयोग करना सबसे अच्छा तरीका है। लेकिन लगभग निश्चित रूप से यह करने का एक बेहतर तरीका है कि आप जो भी कर रहे हैं वह वैश्विक चर की स्थापना / परीक्षण से हो।

उदाहरण के लिए, यदि आप पहली बार किसी फ़ंक्शन को कॉल करने के लिए एक मॉड्यूल-स्तरीय चर को इनिशियलाइज़ करना चाहते हैं, तो आप इस तरह से कोड के साथ बेहतर हो सकते हैं:

my_variable = None

def InitMyVariable():
  global my_variable
  if my_variable is None:
    my_variable = ...

2
मैं इसका उपयोग नहीं करने की कोशिश करता हूं, क्योंकि यह वैश्विक नाम स्थान को प्रदूषित करता है। एक तरीका यह से बचने के लिए एक वर्ग चर के रूप में my_variable, और परिभाषित करने के साथ, समारोह एक वर्ग बनाने के लिए है कॉल मौजूदा समारोह के शरीर के रूप में है, लेकिन उस कोड के लिए एक दर्द है और अन्य प्रश्न के एक झुंड को खोलता है। मैं फ़ंक्शन विशेषताओं का उपयोग करना पसंद करता हूं, नीचे देखें।
सम्वत्

17

ऑब्जेक्ट / मॉड्यूल के लिए, आप भी कर सकते हैं

'var' in dir(obj)

उदाहरण के लिए,

>>> class Something(object):
...     pass
...
>>> c = Something()
>>> c.a = 1
>>> 'a' in dir(c)
True
>>> 'b' in dir(c)
False

11

मैं मानूंगा कि परीक्षण एक फ़ंक्शन में उपयोग होने जा रहा है, उपयोगकर्ता 97370 के उत्तर के समान । मुझे वह उत्तर पसंद नहीं है क्योंकि यह वैश्विक नाम स्थान को प्रदूषित करता है। इसे ठीक करने का एक तरीका इसके बजाय एक वर्ग का उपयोग करना है:

class InitMyVariable(object):
  my_variable = None

def __call__(self):
  if self.my_variable is None:
   self.my_variable = ...

मुझे यह पसंद नहीं है, क्योंकि यह कोड को जटिल करता है और इस तरह के प्रश्नों को खोलता है, क्या इस से सिंगलटन प्रोग्रामिंग पैटर्न की पुष्टि होनी चाहिए? सौभाग्य से, पायथन ने कुछ समय के लिए कार्यों को करने की अनुमति दी है, जो हमें यह सरल समाधान देता है:

def InitMyVariable():
  if InitMyVariable.my_variable is None:
    InitMyVariable.my_variable = ...
InitMyVariable.my_variable = None

9

catchexceptपायथन में कहा जाता है। इसके अलावा यह ऐसे साधारण मामलों के लिए ठीक है। वहाँ है AttributeErrorकि अगर एक वस्तु एक विशेषता है की जाँच करने के लिए इस्तेमाल किया जा सकता है।


5

इस तरह की स्थिति से निपटने के लिए अक्सर काम करने वाला तरीका स्पष्ट रूप से यह जांचने के लिए नहीं है कि क्या चर मौजूद है, लेकिन बस आगे बढ़ें और कोशिश में / गैर-नामांकित चर के पहले उपयोग को लपेटें / NameError को छोड़कर:

# Search for entry.
for x in y:
  if x == 3:
    found = x

# Work with found entry.
try:
  print('Found: {0}'.format(found))
except NameError:
  print('Not found')
else:
  # Handle rest of Found case here
  ...

3

मैंने एक कस्टम फंक्शन बनाया।

def exists(var):
     var_exists = var in locals() or var in globals()
     return var_exists

फिर फ़ंक्शन को कॉल करें जैसे variable_nameकि आप जिस चर की जांच करना चाहते हैं, उसके साथ इस प्रकार है :

exists("variable_name")

लौटेगा TrueयाFalse


2
नहींं, यह काम नहीं करेगा। locals()है ... अरे ... कार्य करने के लिए स्थानीय exists😅
bgusach

1
1) स्थानीय () फ़ंक्शन स्थानीय है। 2) var_exists का अतिरिक्त कार्य क्यों?
डेव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.