2012-11-29 4 views
9

में खाली फ़ंक्शन परिभाषाओं का पता लगाने के लिए मुझे यह पता लगाने की आवश्यकता है कि कोई फ़ंक्शन एक खाली परिभाषा है या नहीं।पायथन

def foo(): 
    pass 

या की तरह:

def foo(i, *arg, **kwargs): 
    pass 

या की तरह:

foo = lambda x: None 

'निरीक्षण' मॉड्यूल का उपयोग कर उन्हें पता लगाने के लिए सबसे सुंदर तरीका क्या है ऐसा लगता है कि हो सकता है? क्या इससे बेहतर तरीका है:

def isEmptyFunction(func): 
    e = lambda: None 
    return func.__code__.co_code == e.__code__.co_code 
+0

आप generate_tokens का उपयोग और देखें कि क्या टोकन के साथ "डीईएफ़" या "लैम्ब्डा" शुरू कर सकते हैं:

मेरी प्रयोजनों के लिए, यह सिर्फ के लिए परीक्षण करने के लिए अतिरिक्त मामले को जोड़ने के लिए काम करता है। इसके बाद, तुरंत बाद में ":" और "पास" या "कोई नहीं" देखें। साफ नहीं है, लेकिन मुझे लगता है कि यह काम करना चाहिए। – spicavigo

+0

फिर भी एक और तरीका Ast मॉड्यूल का उपयोग करना होगा और फ़ंक्शन स्ट्रिंग को पार्स करना होगा। मुझे लगता है कि आप विवरण का काम कर सकते हैं। – spicavigo

+3

जिस तरह से आप इसे कर रहे हैं ठीक दिखता है। – BrenBarn

उत्तर

1

जिस तरह से आप काम का उपयोग कर रहे हैं। एक अधिक "सुरुचिपूर्ण" समाधान में कार्यों की एक सूची होगी, और आपके खाली (या आपके सभी खाली-खाली) कार्यों में आप इसे सूची में जोड़ देंगे, और फिर जांच लें कि फ़ंक्शन सूची में है या नहीं ।

-2

आप ऐसा क्यों करेंगे? यह खराब डिजाइन की तरह दिखता है। मैं शर्त लगाता हूं कि आप कुछ भी तेज नहीं करेंगे।

python -m timeit -s'def a(): pass' -s'def b(): pass' 'if a.__code__.co_code == b.__code__.co_code: pass' 
1000000 loops, best of 3: 0.293 usec per loop 

python -m timeit -s 'def a(): pass' -s 'def b(): pass' 'a()' 
10000000 loops, best of 3: 0.0941 usec per loop 

ऐसा लगता है जैसे कि यह परिमाण की तुलना में सिर्फ कहते हैं की तुलना करने के धीमी है, क्योंकि वहाँ बाद timeit में 10 गुना अधिक छोरों थे। बराबर ऑपरेटर वास्तव में निश्चित रूप से एक कॉल करता है। कोड .co_code। ईक। तो आप बस चीजों को धीमा कर रहे हैं।

4

आपके द्वारा प्रस्तावित विधि काफी काम नहीं करती है क्योंकि डॉकस्ट्रिंग वाले खाली कार्यों में थोड़ा अलग बाइटकोड होता है।

कोई docstring के साथ एक खाली समारोह के लिए func.__code__.co_code का मूल्य, 'd\x00\x00S' है, जबकि एक docstring के साथ एक समारोह के लिए इसके बारे में मूल्य 'd\x01\x00S' है।

def isEmptyFunction(func): 
    def empty_func(): 
     pass 

    def empty_func_with_doc(): 
     """Empty function with docstring.""" 
     pass 

    return func.__code__.co_code == empty_func.__code__.co_code or \ 
     func.__code__.co_code == empty_func_with_doc.__code__.co_code