2008-09-26 7 views
250

मेरे पास मेरे सिस्टम पर एक पायथन मॉड्यूल स्थापित है और मैं यह देखने में सक्षम होना चाहता हूं कि इसमें कौन से फ़ंक्शन/कक्षाएं/विधियां उपलब्ध हैं।पायथन मॉड्यूल में सभी कार्यों को कैसे सूचीबद्ध करें?

मैं प्रत्येक पर दस्तावेज़ समारोह को कॉल करना चाहता हूं। रूबी में मैं उस कक्षा में उपलब्ध सभी विधियों की एक सूची प्राप्त करने के लिए ClassName.methods की तरह कुछ कर सकता हूं। क्या अजगर में कुछ समान है?

उदाहरण के लिए। कुछ ऐसा:

from somemodule import foo 
print foo.methods # or whatever is the correct method to call 
+0

कृपया चयनित उत्तर की समीक्षा करने पर विचार करें! अन्य उत्तरों में सुझाए गए समाधानों का उपयोग करने के लिए बेहतर/आसान हैं। – r2d2oid

उत्तर

90

निरीक्षण मॉड्यूल। इंटरैक्टिव दुभाषिया में pydoc मॉड्यूल, help() फ़ंक्शन और pydoc कमांड-लाइन टूल भी देखें जो आपके बाद के दस्तावेज़ों को उत्पन्न करता है। आप उन्हें वह कक्षा दे सकते हैं जिसे आप दस्तावेज देखना चाहते हैं। उदाहरण के लिए, वे HTML आउटपुट भी उत्पन्न कर सकते हैं और इसे डिस्क पर लिख सकते हैं।

+1

मैंने [my answer] (http://stackoverflow.com/a/31005891/21028) में कुछ स्थितियों में 'ast' मॉड्यूल का उपयोग करने के लिए केस बनाया है। – csl

+20

मुझे समझ में नहीं आ रहा है कि इसे उत्तर के रूप में क्यों चुना गया था, जबकि स्पष्ट रूप से एक बेहतर है ... – frankliuao

331

आप सभी उपलब्ध विधियों/विशेषताओं को देखने के लिए dir(module) का उपयोग कर सकते हैं। PyDocs भी देखें।

+10

यह सख्ती से सच नहीं है। 'Dir()' function "पूर्ण, सूचना के बजाय सबसे प्रासंगिक उत्पादन करने का प्रयास करता है"। स्रोत: http://docs.python.org/library/functions.html#dir। – Zearin

+14

@jAckOdE उद्धृत? फिर आपको स्ट्रिंग मॉड्यूल के उपलब्ध विधियों और विशेषताओं को मिल जाएगा। – OrangeTux

+0

@ ऑरेंजटक्स: ओह, जो एक प्रश्न होना चाहिए। हाँ, आपने इसका उत्तर दिया। – jAckOdE

56
import types 
import yourmodule 

print [yourmodule.__dict__.get(a) for a in dir(yourmodule) 
    if isinstance(yourmodule.__dict__.get(a), types.FunctionType)] 
+7

इस मार्ग के लिए, अपने मॉड्यूल के बजाय getattr (yourmodule, a, none) का उपयोग करें .__ dict __। (ए) –

+0

केवल कार्यों को दिखाता है, वर्ग नहीं, आदि –

+4

your_module .__ dict__ मेरी पसंद है क्योंकि आपको वास्तव में फ़ंक्शन नाम वाला एक नियम मिलता है नाम: और अब आपके पास उस कार्य को गतिशील रूप से कॉल करने की क्षमता है। अच्छा समय! – jsh

108

एक बार जब आप import मॉड्यूल एड है, तो आप सिर्फ कर सकते हैं:

help(modulename) 

... एक बार में सभी कार्यों पर डॉक्स पाने के लिए, सहभागी। या आप इसका उपयोग कर सकते हैं:

dir(modulename) 

... मॉड्यूल में परिभाषित सभी कार्यों और चर के नामों को आसानी से सूचीबद्ध करने के लिए।

25

इस चाल करना होगा:

dir(module) 

हालांकि, यदि आप पाते हैं यह कष्टप्रद लौटे सूची पढ़ने के लिए, बस प्रत्येक पंक्ति में एक नाम पाने के लिए निम्नलिखित पाश का उपयोग करें।

for i in dir(module): print i 
53

के साथ एक उदाहरण का निरीक्षण:

from inspect import getmembers, isfunction 
from my_project import my_module 

functions_list = [o for o in getmembers(my_module) if isfunction(o[1])] 

getmembers (OBJECT_NAME, object_type) tuples की एक सूची देता है।

आप निरीक्षण मॉड्यूल में किसी अन्य xXXX फ़ंक्शंस के साथ निष्पादन को प्रतिस्थापित कर सकते हैं।

+17

'getmembers' एक अनुमान लगा सकते हैं, इसलिए आपका उदाहरण भी लिखा जा सकता है: 'functions_list = [o o getmembers में (o_module, isfunction)] ' –

+13

@ क्रिस्टोफर कुरी, आप 'functions_list = getmembers (my_module, predicate)' के साथ बेकार सूची समझ से बच सकते हैं क्योंकि यह पहले से ही एक सूची लौटाता है;) – Nil

+0

यह पता लगाने के लिए कि उस मॉड्यूल में फ़ंक्शन को परिभाषित किया गया है (आयात किए जाने के बजाय) जोड़ें: "अगर इफंक्शन (ओ [1]) ** और ओ [1] .__ मॉड्यूल__ == my_module .__ नाम __ **" - ध्यान दें कि आयातित functi अगर यह आवश्यक रूप से काम नहीं करेगा इस मॉड्यूल के समान नाम वाले मॉड्यूल से आता है। –

17

dir(module) अधिकांश उत्तरों में वर्णित स्क्रिप्ट या मानक दुभाषिया का उपयोग करते समय मानक तरीका है।

हालांकि IPython जैसे इंटरैक्टिव पायथन शेल के साथ आप मॉड्यूल में परिभाषित सभी ऑब्जेक्ट्स का अवलोकन पाने के लिए टैब-पूर्णता का उपयोग कर सकते हैं। यह मॉड्यूल में परिभाषित करने के लिए एक स्क्रिप्ट और print का उपयोग करने से कहीं अधिक सुविधाजनक है।

  • module.<tab> आप सभी वस्तुओं मॉड्यूल में परिभाषित (काम करता है, वर्गों और इसी तरह)
  • module.ClassX.<tab> आप तरीकों और एक वर्ग की विशेषताओं
  • module.function_xy? या module.ClassX.method_xy? आप की docstring दिखाएगा दिखाएगा दिखाएगा वह फ़ंक्शन/विधि
  • module.function_x?? या module.SomeClass.method_xy?? आपको फ़ंक्शन/विधि का स्रोत कोड दिखाएगा।
-5

यह डीआईआर (मॉड्यूल) का उपयोग करने के लिए उचित नहीं है (या कम से कम अब नहीं)। कोड इस तरह पढ़ना चाहिए:

dir('module') or dir('modules') 

या आप मॉड्यूल आप इस तरह चाहते हैं निर्दिष्ट करें: dir('sys') मॉड्यूल का नाम sys से परिणाम प्राप्त होने की। dir() त्रुटियां लौटाता है जबकि dir('') आपको वही चाहिए जो आपको चाहिए। * सहायता ('') अधिकांश कार्यों के लिए उपलब्ध होने पर सहायता जानकारी वापस कर देगी। जैसे; help('modules') मॉड्यूल सहायता जानकारी लौटाएगा।

सभी नीचे दिए गए वोटों के लिए धन्यवाद। जब मैंने इसे पोस्ट किया था तो मैं Python3.2.2 और अन्य 3x संस्करणों का उपयोग कर रहा था। बिंदु पिछले (सामान) के बजाय ('सामान') का उपयोग करना था। लेकिन मुझे लगता है कि आप सब पाइथन 2 पर फंस गए हैं या पीसी के लिए नए संस्करणों का उपयोग नहीं कर रहे हैं जैसे मोबाइल था। यदि आप नहीं कर पा रहे आयात आयात त्रुटियों के बिना पायथन फ़ाइल कहा करने के लिए

http://effbot.org/librarybook/sys.htm

+0

या आप जिस मॉड्यूल को चाहते हैं उसे निर्दिष्ट करें: मॉड्यूल नाम sys से परिणाम उत्पन्न करने के लिए dir ('sys')। dir() त्रुटियों को लौटाता है जबकि dir ('') की आपको आवश्यकता होती है। * सहायता ('') अधिकांश कार्यों के लिए उपलब्ध होने पर सहायता जानकारी वापस कर देगी।जैसे; सहायता ('मॉड्यूल') मॉड्यूल सहायता जानकारी वापस कर देगा। –

+5

डीआईआर ('मॉड्यूल') स्ट्रिंग फ़ंक्शन के लिए विधियों को लौटाता है, जो आप अपेक्षा करते हैं उससे बिल्कुल अलग है। मेरा मानना ​​है कि यह अजगर के लिए भी समान है 3. –

1

इन उत्तरों में से कोई भी काम करेंगे। यह मेरे लिए मामला था जब मैं एक फाइल का निरीक्षण कर रहा था जो बहुत से निर्भरताओं के साथ बड़े कोड बेस से आता है। निम्नलिखित फ़ाइल को "def" से शुरू होने वाले सभी विधि नामों के लिए टेक्स्ट और खोज के रूप में संसाधित करेंगे और उन्हें और उनकी लाइन संख्याएं मुद्रित करेंगी।

import re 
pattern = re.compile("def (.*)\(") 
for i, line in enumerate(open('Example.py')): 
    for match in re.finditer(pattern, line): 
    print '%s: %s' % (i+1, match.groups()[0]) 
+1

इस मामले में 'अस्थ' मॉड्यूल का उपयोग करना बेहतर है। उदाहरण के लिए [मेरा जवाब] (http://stackoverflow.com/a/31005891/21028) देखें। – csl

+0

मुझे लगता है कि यह एक वैध विधि है। जब यह एक डाउनवोट करता है? – erm3nda

21

पूर्णता 'के लिए, मैं बाहर बात करने के लिए है कि कभी कभी आप इसे आयात करने के बजाय पार्स कोड कर सकते हैं करना चाहते हैं। एक import शीर्ष-स्तरीय अभिव्यक्ति निष्पादित करेगा, और यह एक समस्या हो सकती है।

उदाहरण के लिए, मैं उपयोगकर्ताओं को zipapp के साथ किए जा रहे पैकेजों के लिए एंट्री पॉइंट फ़ंक्शंस चुनने दे रहा हूं। import और inspect का उपयोग करके भटकने वाले कोड चलने वाले जोखिम, क्रैश की ओर अग्रसर, संदेशों को मुद्रित करने में सहायता करें, जीयूआई संवाद पॉप-अप करें और इसी तरह।

इसके बजाय मैं सभी शीर्ष स्तर के कार्यों को सूचीबद्ध करने के ast मॉड्यूल का उपयोग:

import ast 
import sys 

def top_level_functions(body): 
    return (f for f in body if isinstance(f, ast.FunctionDef)) 

def parse_ast(filename): 
    with open(filename, "rt") as file: 
     return ast.parse(file.read(), filename=filename) 

if __name__ == "__main__": 
    for filename in sys.argv[1:]: 
     print(filename) 
     tree = parse_ast(filename) 
     for func in top_level_functions(tree.body): 
      print(" %s" % func.name) 

list.py में इस कोड को लाना और इनपुट के रूप में उपयोग करते हुए, मैं:

$ python list.py list.py 
list.py 
    top_level_functions 
    parse_ast 
बेशक

, एक एएसटी नेविगेट करना कभी-कभी मुश्किल हो सकता है, यहां तक ​​कि पाइथन जैसी अपेक्षाकृत सरल भाषा के लिए भी, क्योंकि एएसटी काफी कम स्तर है। लेकिन अगर आपके पास एक सरल और स्पष्ट उपयोग केस है, तो यह दोनों काम करने योग्य और सुरक्षित है।

हालांकि, नकारात्मकता यह है कि आप रनटाइम पर जेनरेट किए गए कार्यों का पता नहीं लगा सकते हैं, जैसे foo = lambda x,y: x*y

+1

मुझे यह पसंद है; मैं वर्तमान में यह पता लगाने की कोशिश कर रहा हूं कि किसी ने पहले से ही एक उपकरण लिखा है जो कि पाइडोक की तरह कुछ करता है लेकिन मॉड्यूल आयात किए बिना। अब तक यह सबसे अच्छा उदाहरण है जिसे मैंने पाया है :) –

+1

यह निश्चित रूप से ऐसा करने का सही तरीका है, अधिक सुरक्षित! धन्यवाद! – David

-5

आप खोल से सूची अपने मॉड्यूल में सभी कार्यों को पाने के लिए निम्न विधि का उपयोग कर सकते हैं:

import module

module.*? 
0

dir (मॉड्यूल) या मदद (मॉड्यूल) पिछले जवाब में उल्लेख किया अलावा, आप यह भी कोशिश कर सकते हैं:
- ओपन आईपीथॉन
- आयात मॉड्यूल_नाम
- टाइप मॉड्यूल_नाम, टैब दबाएं। यह पाइथन मॉड्यूल में सभी कार्यों को सूचीबद्ध करने के साथ एक छोटी सी खिड़की खुल जाएगा।
यह बहुत साफ दिखता है।

यहाँ hashlib मॉड्यूल

(C:\Program Files\Anaconda2) C:\Users\lenovo>ipython 
Python 2.7.12 |Anaconda 4.2.0 (64-bit)| (default, Jun 29 2016, 11:07:13) [MSC v.1500 64 bit (AMD64)] 
Type "copyright", "credits" or "license" for more information. 

IPython 5.1.0 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object', use 'object??' for extra details. 

In [1]: import hashlib 

In [2]: hashlib. 
      hashlib.algorithms   hashlib.new     hashlib.sha256 
      hashlib.algorithms_available hashlib.pbkdf2_hmac   hashlib.sha384 
      hashlib.algorithms_guaranteed hashlib.sha1     hashlib.sha512 
      hashlib.md5     hashlib.sha224 
1

के सभी कार्यों को सूचीबद्ध छोटा सा अंश है कोड है कि आप पार्स करने के लिए इच्छा नहीं है के लिए, मैं @csl की एएसटी आधारित दृष्टिकोण से ऊपर सलाह देते हैं।

सब कुछ के लिए, निरीक्षण मॉड्यूल सही है:

import inspect 

import <module_to_inspect> as module 

functions = inspect.getmembers(module, inspect.isfunction) 

यह फार्म [(<name:str>, <value:function>), ...] में 2-tuples की एक सूची देता है।

ऊपर दिए गए सरल उत्तर को विभिन्न प्रतिक्रियाओं और टिप्पणियों में संकेत दिया गया है, लेकिन स्पष्ट रूप से नहीं कहा जाता है।

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

  • कोई संबंधित समस्या नहीं^_^