2011-06-17 18 views
13

संभव डुप्लिकेट मौजूद हैं:
Python - checking variable existingपायथन: जाँच लें कि वस्तु दायरे में

वहाँ एक वस्तु दायरे में मौजूद रहने पर जाँच करने के लिए एक कुशल, सरल और pythonic तरीका है?

पायथन में सबकुछ एक वस्तु (चर, कार्य, कक्षाएं, कक्षा उदाहरण इत्यादि) है, इसलिए मैं किसी वस्तु के लिए एक सामान्य अस्तित्व परीक्षण की तलाश में हूं, इससे कोई फर्क नहीं पड़ता कि यह क्या है।

मुझे उम्मीद है कि वहां exists()built-in function होगा, लेकिन मुझे बिल फिट करने के लिए कोई भी नहीं मिला।

उत्तर

17

आप हमेशा किए जा सकेंगे:

try: 
    some_object 
except NameError: 
    do_something() 
else: 
    do_something_else() 
+2

यह आमतौर पर यह कर की "pythonic" जिस तरह से माना जाता है। – martineau

+3

यह तब प्रभावी होता है जब अधिकांश मामलों में ऑब्जेक्ट अपवाद को पकड़ने के रूप में मौजूद होता है एक महंगा घटना – Jonathan

5

मैं तुम्हें locals की तरह कुछ के लिए देख रहे विश्वास करते हैं। यहाँ यह कैसे काम करता है:

>>> foo = 1 
>>> l = locals() 
>>> print l 
{'__builtins__': <module '__builtin__' (built-in)>, 'l': {...}, 
'__package__': None,'__name__':'__main__', 'foo': 1, '__doc__': None} 
>>> print l['foo'] 
1 
+0

आपको प्रत्येक बार जब आप अस्तित्व की जांच करना चाहते हैं तो स्थानीय लोगों को अपडेट करने के लिए स्थानीय लोगों को कॉल करने की आवश्यकता होगी, मेरा अनुमान होगा कि यह कम है कोशिश-छोड़ने की विधि से कुशल, यद्यपि बेंचमार्क – Jonathan

+1

क्रमशः – prgbenz

+0

की जांच के लिए l.has_key ('foo') का उपयोग करना बेहतर है, जो पाइथन सामान्य रूप से किसी नाम के लिए करता है, वह अनुक्रम का अनुक्रम 'स्थानीय() ' , 'ग्लोबल्स() ', और' वर्र्स (__ बिल्टिन __)' - इसलिए यह * यह नहीं देख रहा है कि कोई नाम वर्तमान में गुंजाइश है या नहीं। – martineau

1

यह अपने खुद के लिखने के लिए संभव है:

import __builtin__ 
import sys 

def exists(name): 
    return (name in sys._getframe(1).f_locals # caller's locals 
     or name in sys._getframe(1).f_globals # caller's globals 
     or name in vars(__builtin__)   # built-in 
    ) 

if __name__=='__main__': 
    def foobar(): 
     local_var = 42 
     print 'exists("global_var"):', exists("global_var") 
     print 'exists("local_var"):', exists("local_var") 

    print 'exists("baz"):', exists("baz") # undefined 
    print 'exists("dict"):', exists("dict") # built-in 
    foobar() # global_var doesn't exist yet 
    global_var = 'I think, therefore I am' 
    print 'exists("global_var"):', exists("global_var") 
    foobar() # now global_var exists 
5

एक फर्क है कि क्या आप यह निर्धारित करने में एक स्थानीय या किसी वस्तु की विशेषता मौजूद है की कोशिश कर रहे होंगे। किसी ऑब्जेक्ट के लिए, हैट्टर (ऑब्जेक्ट, "विशेषता") चाल करेगा।

यह भी मॉड्यूल पर काम:

import math 
hasattr(math,"pow") => True 

लेकिन हम क्या मुख्य गुंजाइश कॉल कर सकते हैं, तो आप स्थानीय लोगों(), hasattr के रूप में() वस्तु के कुछ प्रकार की जरूरत में खुदाई करने के लिए उपयोग करना होगा के लिए ।

def exists(name,obj=None): 
if obj is None: return locals().has_key(name) 
else: return hasattr(obj,name) 

enter code here 
19

आप hasattr() के लिए खोज हो रहे हैं: इस मामले में कोई भी ...

exists_mainscope = lambda name: locals().has_key(name) 
exists_mainscope("test") => False 

तो, क्या आप देख रहे हैं निम्नलिखित हो सकता है। आप इसका उपयोग यह देखने के लिए करते हैं कि, किसी ऑब्जेक्ट के नेमस्पेस के दायरे में (और यहां तक ​​कि आयातित मॉड्यूल ऑब्जेक्ट्स हैं), एक दिया गया विशेषता नाम मौजूद है।

तो, मैं कर सकते हैं:

>>> import math 
>>> hasattr(math, 'atan') 
True 

या कुछ और की तरह:

>>> class MyClass(object): 
...  def __init__(self): 
...   self.hello = None 
... 
>>> myObj = MyClass() 
>>> hasattr(myObj, 'hello') 
True 
>>> hasattr(myObj, 'goodbye') 
False 
+0

हां में चर के अस्तित्व को इंगित करता है। हैट्टर के बारे में बात करने का कोई जवाब नहीं है, इसलिए मैं एक को तैयार करता हूं, यह सुनिश्चित करता हूं कि मेरे उदाहरण सही तरीके से काम करें, फिर इसे पोस्ट करें, और पाओ! @ कुत्ते-खाने-बिल्ली-दुनिया ने मुझे इसे हरा दिया है। –

संबंधित मुद्दे