2009-07-09 29 views
20

में स्पष्ट रूप से परिभाषित कार्यों को ढूंढें ठीक है, मुझे पता है कि आप मॉड्यूल में सबकुछ सूचीबद्ध करने के लिए dir() विधि का उपयोग कर सकते हैं, लेकिन क्या उस मॉड्यूल में परिभाषित कार्यों को देखने का कोई तरीका है? यहां तक ​​कि अगर मैं builtins को फ़िल्टर करने के निरीक्षण का उपयोग()मॉड्यूल (पायथन)

from datetime import date, datetime 

def test(): 
    return "This is a real method" 

, मैं अभी भी कुछ भी है कि आयात किया गया था के साथ छोड़ दिया है: उदाहरण के लिए, मान मेरी मॉड्यूल इस तरह दिखता है। उदा मैं देखेंगे:

[ 'तारीख', 'दिनांक', 'परीक्षण']

वहाँ आयात को बाहर करने का कोई तरीका है? या मॉड्यूल में क्या परिभाषित किया गया है यह जानने का एक और तरीका?

+1

स्रोत पढ़ने में क्या गड़बड़ है? –

+0

पायथन में, "विधि" आमतौर पर केवल उन वर्गों के संदर्भों के संदर्भ में उपयोग की जाती है जो कक्षा के गुण हैं। आपका 'टेस्ट() 'बेहतर रूप से" फ़ंक्शन "के रूप में जाना जाता है। – Miles

उत्तर

25

क्या आप इस तरह कुछ ढूंढ रहे हैं?

import sys, inspect 

def is_mod_function(mod, func): 
    return inspect.isfunction(func) and inspect.getmodule(func) == mod 

def list_functions(mod): 
    return [func.__name__ for func in mod.__dict__.itervalues() 
      if is_mod_function(mod, func)] 


print 'functions in current module:\n', list_functions(sys.modules[__name__]) 
print 'functions in inspect module:\n', list_functions(inspect) 

संपादित करें: बदली गई 'समारोह' को 'मेथ' से चर नाम भ्रम से बचने के (हम, यहाँ काम करता है, नहीं तरीकों के साथ काम कर रहे हैं)।

+0

दुर्भाग्यवश, यह सजाए गए कार्यों के लिए काम नहीं करेगा। –

+0

@ars यदि आप निरीक्षण करते हैं तो इंफ्रेंस.getmembers (mod) में f के लिए '[f [1] के साथ अपने कार्यों को प्रतिस्थापित नहीं कर सका। संतुष्टि (एफ [1])]' और एक ही परिणाम प्राप्त करें? – mVChr

+0

कभी भी नहीं, इसमें आयातित फ़ंक्शंस शामिल होंगे, फिर भी काम करने के लिए 'getmodule (func) == mod' की आवश्यकता है, लेकिन फिर भी एक-आईएसएच लाइनर। – mVChr

1

पायथन में प्रत्येक वर्ग में __module__ विशेषता है। आप फ़िल्टरिंग करने के लिए अपने मूल्य का उपयोग कर सकते हैं। example 6.14 in dive into python

+0

लेकिन यह कक्षा नहीं है, यह मॉड्यूल में परिभाषित कुछ विधियों है ... – Cory

+0

कार्यों में '__module__' विशेषता भी है। – Miles

0

पाइथन inspect मॉड्यूल शायद एक ऐसा नज़र डालें जो आप यहां देख रहे हैं।

import inspect 
if inspect.ismethod(methodInQuestion): 
    pass # It's a method 
+1

मैंने यह कोशिश की - निरीक्षण अभी भी आयातित विधियों को लौटाता है – Cory

+0

ऐसा लगता है कि यह स्टीफानो के उत्तर के साथ संयोजन में काम करेगा। आप देख सकते हैं कि एक विधि क्या है और क्या आयात किया जाता है। –

+1

मैं इस पोस्ट पर टिप्पणी कर रहा हूं क्योंकि मेरा प्रतिनिधि 50 वर्ष से कम है। कार्यों में __module__ विशेषता भी है। –

4

कैसे निम्नलिखित के बारे में:

grep ^def my_module.py 
+0

हाहा, हालांकि एक बेहतर तरीका होना चाहिए, है ना? – Cory

+0

यह एक त्वरित और गंदा समाधान है जो काम करता है। यह आपकी समस्या का सबसे अच्छा समाधान नहीं हो सकता है लेकिन मुझे नहीं पता क्योंकि मुझे नहीं पता कि आप किस समस्या को हल करने की कोशिश कर रहे हैं। –

+0

+1: बस स्रोत पढ़ें। –

2

आप देख सकते हैं __module__ सवाल में समारोह की विशेषता। मैं "फ़ंक्शन" कहता हूं क्योंकि एक विधि आमतौर पर कक्षा से संबंधित होती है ;-)।

बीटीडब्ल्यू, वास्तव में कक्षा में __module__ विशेषता भी है।

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