পাইথন মডিউলে সমস্ত ফাংশন কীভাবে তালিকাভুক্ত করা যায়?


418

আমার সিস্টেমে পাইথন মডিউল ইনস্টল করা আছে এবং আমি এতে কোন ফাংশন / ক্লাস / পদ্ধতি উপলব্ধ তা দেখতে সক্ষম হতে চাই।

আমি প্রত্যেককে ডক ফাংশন কল করতে চাই। রুবিতে আমি ক্লাসনেম.মোথডসের মতো কিছু করতে পারি সেই ক্লাসে উপলব্ধ সমস্ত পদ্ধতির তালিকা পেতে। পাইথনে কি তেমন কিছু আছে?

যেমন। কিছুটা এইরকম:

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

3
নির্বাচিত উত্তর পর্যালোচনা বিবেচনা করুন! অন্যান্য উত্তরে প্রস্তাবিত সমাধানগুলি ব্যবহার করতে আরও ভাল / সহজ are
জহরা

উত্তর:


139

inspectমডিউল। এছাড়াও pydocমডিউলটি, help()ইন্টারেক্টিভ ইন্টারপ্রেটারে ফাংশন এবং pydocকমান্ড-লাইন সরঞ্জামটি যা আপনার পরে ডকুমেন্টেশন তৈরি করে। আপনি ডকুমেন্টেশন দেখতে ইচ্ছুক ক্লাসটি তাদের দিতে পারেন। তারা উদাহরণস্বরূপ, এইচটিএমএল আউটপুটও উত্পন্ন করতে এবং এটিকে ডিস্কে লিখতে পারে।


3
আমি আমার উত্তরেast নির্দিষ্ট পরিস্থিতিতে মডিউলটি ব্যবহারের জন্য কেস তৈরি করেছি ।
সিএসএল

28
টিএল; নীচের উত্তরগুলির ডিআর: dirফাংশন এবং ভেরিয়েবলগুলি ফেরত দিতে ব্যবহার করুন ; inspectশুধুমাত্র ফিল্টার ফাংশন ব্যবহার ; এবং astআমদানি না করে পার্স করতে ব্যবহার করুন ।
জোনাথন এইচ

শেলজহানের সংক্ষিপ্তসার অনুসারে প্রতিটি পদ্ধতির পরীক্ষার পক্ষে এটি কার্যকর কারণ ফলাফল আউটপুট এক সমাধান থেকে পরের সমাধানের চেয়ে একেবারে আলাদা।
ক্লোজাচ

1
@ হ্যাক-আর মায়োমডুলের সমস্ত ফাংশন তালিকাভুক্ত করার জন্য এখানে কোডটি রয়েছে: [চ [0] এফ ইনপেক্ট.টেমেমবার্সে (মাইমোডিউল, ইন্সপেক্ট.আইসফানশন)]
সারপ্রাইজডগ

498

আপনি dir(module)সমস্ত উপলব্ধ পদ্ধতি / বৈশিষ্ট্যগুলি দেখতে ব্যবহার করতে পারেন। পাইডোকসও পরীক্ষা করে দেখুন।


15
এটি কঠোরভাবে সত্য নয়। dir()ফাংশন "প্রচেষ্টা সর্বাধিক প্রাসঙ্গিক বদলে সম্পূর্ণ তথ্য উত্পাদন করতে"। সূত্র: ডকস.পিথন.আর / লাইবারি / ফাংশনস html#dir
জেরেইন

15
@jAckOdE উদ্ধৃত? তারপরে আপনি স্ট্রিং মডিউলটির উপলব্ধ পদ্ধতি এবং বৈশিষ্ট্যগুলি পাবেন।
অরেঞ্জটাক্স 6:44 এ 6'14

@ ওরেঞ্জটাক্স: ওফ, এটি একটি প্রশ্ন হওয়ার কথা। হ্যাঁ, আপনি এটি উত্তর।
জ্যাকডে

1
ওপি স্পষ্টভাবে ফাংশনগুলির জন্য জিজ্ঞাসা করে, ভেরিয়েবলের জন্য নয়। সিএফ উত্তর ব্যবহার করে inspect
জোনাথন এইচ

168

importমডিউলটি সম্পাদনা করার পরে আপনি কেবল এটি করতে পারেন:

 help(modulename)

... ইন্টারঅ্যাকটিভভাবে সমস্ত ফাংশনে ডক্স পেতে। অথবা আপনি ব্যবহার করতে পারেন:

 dir(modulename)

... মডিউলটিতে সংজ্ঞায়িত সমস্ত ফাংশন এবং ভেরিয়েবলের নাম তালিকাভুক্ত করার জন্য।


1
@ শেলজাহান… এই সমালোচনার মূল বক্তব্য কী? আমার সমাধান এছাড়াও ফাংশন সূচী নির্মাণ করে এবং inspect মডিউল তালিকায় ভেরিয়েবল, যদিও স্পষ্টভাবে এখানে অনুরোধ করতে পারবেন না। এই সমাধানটির জন্য কেবল অন্তর্নির্মিত অবজেক্টগুলির প্রয়োজন, যা কিছু ক্ষেত্রে সীমাবদ্ধ / লকডাউন / ভাঙ্গা পরিবেশে পাইথন ইনস্টল থাকা খুব কার্যকর হতে পারে।
ড্যান লেন্সকি 20

ধন্যবাদ, এটি প্রায় কাজ করেছে, তবে আমি ভেবেছিলাম dirফলাফলগুলি মুদ্রণ করবে, তবে আপনাকে এটি করা দরকার বলে মনে হচ্ছে print(dir(modulename))
এলিয়ট

96

পরিদর্শন সহ একটি উদাহরণ:

from inspect import getmembers, isfunction
from my_project import my_module

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

গেটেমবার্সগুলি (অবজেক্ট_নাম, অবজেক্ট_ টাইপ) টিউপসগুলির একটি তালিকা প্রদান করে।

আপনি পরিদর্শন মডিউলটিতে অন্য যে কোনও এক্সএক্সএক্সএক্স কার্যক্রমে আইসফঞ্চনটি প্রতিস্থাপন করতে পারেন।


27
getmembersএকটি প্রাকটিক গ্রহণ করতে পারে, সুতরাং আপনার উদাহরণটিও লেখা যেতে পারে: functions_list = [o for o in getmembers(my_module, isfunction)]
ক্রিস্টোফার কুরি

27
ক্রিস্টোফেরকিরি, আপনি অকার্যকর তালিকা বোঝার সাথে এড়াতেও পারেন functions_list = getmembers(my_module, predicate)কারণ এটি ইতিমধ্যে একটি তালিকা ফেরত দেয়;)
নীল

5
ফাংশনটি সেই মডিউলে সংজ্ঞায়িত করা হয়েছে কিনা তা অনুসন্ধান করতে (আমদানির পরিবর্তে) যুক্ত করুন: "যদি isfunction (ও [1]) এবং ও [1] .__ মডিউল__ == মাই_মডিউল .__ নাম__ " - নোট করুন এটি প্রয়োজনীয়ভাবে কাজ করবে না যদি আমদানি করা ফাংশনটি এই মডিউলটির একই নামযুক্ত একটি মডিউল থেকে আসে।
মাইকেল স্কট কুথবার্ট

72
import types
import yourmodule

print([getattr(yourmodule, a) for a in dir(yourmodule)
  if isinstance(getattr(yourmodule, a), types.FunctionType)])

8
এই রুটের জন্য, আপনার মডুলেলের পরিবর্তে গ্যাটট্রা (আপনার মডেল, ক, কিছুই নয়) ব্যবহার করুন __ ডিক __। পান (ক)
টমাস ওয়াউটারস

4
আপনার_মডিউল .__ ডিক__ আমার পছন্দ কারণ আপনি প্রকৃতপক্ষে ফাংশননামযুক্ত একটি ডিক পেয়েছেন: <ফাংশন> এবং আপনার এখন সেই গতিবেগটি কল করার ক্ষমতা রয়েছে। ভাল সময়!
jsh

1
পাইথন 3 কিছু চিনির সাথে বন্ধুত্বপূর্ণ: আমদানি প্রকারের ডিফ প্রিন্ট_মডিউল_ফিউশনস (মডিউল): মুদ্রণ ('\ n'.join ([আরআর (মডিউল। __ডিক্ট __। ((ক), প্রকার। ফাংশনটাইপ)])))
y.selivonchyk

এটি মডিউলটি আমদানি করে এমন সমস্ত ফাংশনও তালিকাভুক্ত করবে। আপনি যা চান তা হতে পারে বা নাও পারে।
স্কাব্বো

47

সম্পূর্ণতার জন্য, আমি এটি উল্লেখ করতে চাই যে কখনও কখনও আপনি কোডটি আমদানির পরিবর্তে পার্স করতে চান । একটি শীর্ষ-স্তরের এক্সপ্রেশন কার্যকরimport করবে এবং এটি কোনও সমস্যা হতে পারে।

উদাহরণস্বরূপ, আমি ব্যবহারকারীদের জিপআপ দিয়ে তৈরি প্যাকেজগুলির জন্য এন্ট্রি পয়েন্ট ফাংশনগুলি নির্বাচন করতে দিচ্ছি । ব্যবহার importএবং inspectবিপথে কোড চালনাকারী ঝুঁকি, ক্র্যাশ নেতৃস্থানীয়, সাহায্যের বার্তা আউট ছাপা হচ্ছে, গুই ডায়ালগ পপিং আপ ইত্যাদি।

পরিবর্তে আমি সমস্ত শীর্ষ স্তরের ফাংশন তালিকাভুক্ত করতে অ্যাস্ট মডিউলটি ব্যবহার করি :

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


2
আমি এটি পছন্দ করি; আমি বর্তমানে অনুসন্ধানের চেষ্টা করছি যে কেউ ইতিমধ্যে কোনও সরঞ্জাম লিখেছেন যা পাইডোকের মতো কিছু করেছে তবে মডিউলটি আমদানি না করেই। এখনও অবধি এটি এর সেরা উদাহরণটি আমি খুঁজে পেয়েছি :)
জেমস মিলস

এই উত্তরের সাথে একমত টার্গেট ফাইলটি আমদানি করতে পারে বা অজগরটির কোন সংস্করণ লেখা রয়েছে তা নির্বিশেষে আমার এই ফাংশনটির কাজ করা দরকার। এটি আমদানি এবং আমদানি সমস্যাগুলি আমদানি সংক্রান্ত সমস্যার মধ্যে চলে না।
এরিক ইভান্স

মডিউল ভেরিয়েবল ( __version__ইত্যাদি) সম্পর্কে কীভাবে । এটি পাওয়ার কোনও উপায় আছে?
ফ্রেমম্যান 1

29

আপনি যে কোডটি বিশ্লেষণ করতে চান না তার জন্য আমি উপরে @ এসএসএল এর এএসটি ভিত্তিক পদ্ধতির প্রস্তাব দিই।

অন্য কিছুর জন্য, পরিদর্শন মডিউলটি সঠিক:

import inspect

import <module_to_inspect> as module

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

এটি ফর্মের 2-টিপলগুলির একটি তালিকা দেয় [(<name:str>, <value:function>), ...]

উপরের সহজ উত্তরটি বিভিন্ন প্রতিক্রিয়া এবং মন্তব্যে ইঙ্গিতযুক্ত, তবে সুস্পষ্টভাবে বলা হয়নি।


এটি বানান করার জন্য ধন্যবাদ; আমি মনে করি এটি সঠিক উত্তর, যদি আপনি পরিদর্শন করতে মডিউলটিতে আমদানি চালাতে পারেন।
জোনাথন এইচ

25

এটি কৌশলটি করবে:

dir(module) 

তবে, যদি আপনি ফিরে আসা তালিকাটি পড়তে বিরক্তিকর মনে করেন তবে প্রতি লাইনে একটি নাম পেতে কেবল নীচের লুপটি ব্যবহার করুন।

for i in dir(module): print i

2
ওপি স্পষ্টভাবে ফাংশনগুলির জন্য জিজ্ঞাসা করে, ভেরিয়েবলের জন্য নয়। সিএফ উত্তর ব্যবহার করে inspect। এছাড়াও, @ ড্যানলেন্সকির উত্তর থেকে এটি কীভাবে আলাদা?
জোনাথন এইচ

20

dir(module) বেশিরভাগ উত্তরে উল্লিখিত হিসাবে কোনও স্ক্রিপ্ট বা স্ট্যান্ডার্ড ইন্টারপ্রেটার ব্যবহার করার সময় এটি স্ট্যান্ডার্ড উপায়।

তবে আইপিথনের মতো ইন্টারেক্টিভ পাইথন শেলটি দিয়ে আপনি মডিউলটিতে সংজ্ঞায়িত সমস্ত বস্তুর ওভারভিউ পেতে ট্যাব-সমাপ্তি ব্যবহার করতে পারেন। স্ক্রিপ্ট ব্যবহার করা এবং printমডিউলে কী সংজ্ঞায়িত করা হয়েছে তা দেখার চেয়ে এটি অনেক বেশি সুবিধাজনক ।

  • module.<tab> আপনাকে মডিউলে সংজ্ঞায়িত সমস্ত অবজেক্ট দেখায় (ফাংশন, ক্লাস ইত্যাদি)
  • module.ClassX.<tab> আপনাকে কোনও শ্রেণীর পদ্ধতি এবং বৈশিষ্ট্যগুলি প্রদর্শন করবে
  • module.function_xy?বা module.ClassX.method_xy?আপনাকে সেই ফাংশন / পদ্ধতির ডাস্ট্রিং দেখিয়ে দেবে
  • module.function_x??অথবা module.SomeClass.method_xy??আপনাকে ফাংশন / পদ্ধতির উত্স কোডটি দেখায়।

19

গ্লোবাল ফাংশনগুলির জন্য dir()হ'ল কমান্ডটি (এই উত্তরগুলির বেশিরভাগ হিসাবে উল্লিখিত), তবে এটি উভয় জনসাধারণ এবং অ-পাবলিক ফাংশনকে এক সাথে তালিকাভুক্ত করে।

উদাহরণস্বরূপ চলমান:

>>> import re
>>> dir(re)

ফাংশন / ক্লাসগুলি প্রদান করে:

'__all__', '_MAXCACHE', '_alphanum_bytes', '_alphanum_str', '_pattern_type', '_pickle', '_subx'

যার কয়েকটি সাধারণত সাধারণ প্রোগ্রামিং ব্যবহারের জন্য বোঝানো হয় না (তবে মডিউল নিজেই, ডান্ডারএলিয়াসের মতো __doc__, __file__ect এর ক্ষেত্রে বাদে )। এই কারণে তাদের জনসাধারণের সাথে তালিকাভুক্ত করা কার্যকর নাও হতে পারে (ব্যবহার করার সময় পাইথন কী পেতে হবে তা জানে from module import *)।

__all__এই সমস্যা সমাধানের জন্য ব্যবহার করা যেতে পারে, এটি মডিউলে সমস্ত পাবলিক ফাংশন এবং ক্লাসগুলির একটি তালিকা ফেরত দেয় (যারা আন্ডারস্কোর দিয়ে শুরু করে না - _)। দেখুন ক্যান কেউ পাইথন মধ্যে __all__ ব্যাখ্যা? ব্যবহারের জন্য __all__

এখানে একটি উদাহরণ:

>>> import re
>>> re.__all__
['match', 'fullmatch', 'search', 'sub', 'subn', 'split', 'findall', 'finditer', 'compile', 'purge', 'template', 'escape', 'error', 'A', 'I', 'L', 'M', 'S', 'X', 'U', 'ASCII', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL', 'VERBOSE', 'UNICODE']
>>>

আন্ডারস্কোর সহ সমস্ত ক্রিয়াকলাপ এবং শ্রেণিগুলি সরানো হয়েছে, কেবলমাত্র সেগুলিকে পাবলিক হিসাবে সংজ্ঞায়িত করা হয়েছে এবং তাই এর মাধ্যমে ব্যবহার করা যেতে পারে import *

নোট যা __all__সর্বদা সংজ্ঞায়িত হয় না। যদি এটি অন্তর্ভুক্ত না হয় তবে একটি AttributeErrorউত্থাপিত হয়।

এর একটি ঘটনা অ্যাস্ট মডিউলটির সাথে রয়েছে:

>>> import ast
>>> ast.__all__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'ast' has no attribute '__all__'
>>>

4

আপনি যদি আমদানি ত্রুটি না করে বলা পাইথন ফাইলটি আমদানি করতে অক্ষম হন তবে এই উত্তরগুলির কোনওটিই কাজ করবে না। এটি আমার জন্য তখন যখন আমি একটি ফাইল পরিদর্শন করছিলাম যা অনেকগুলি নির্ভরতা সহ একটি বৃহত কোড বেস থেকে আসে। নিম্নলিখিতটি ফাইলটিকে পাঠ্য হিসাবে প্রক্রিয়া করবে এবং "ডিএফ" দিয়ে শুরু হওয়া সমস্ত পদ্ধতির নাম অনুসন্ধান করবে এবং সেগুলি এবং তাদের লাইন নম্বর মুদ্রণ করবে।

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])

3
এই ক্ষেত্রে astমডিউলটি ব্যবহার করা আরও ভাল better একটি উদাহরণের জন্য আমার উত্তর দেখুন ।
সিএসএল

আমি মনে করি এটি একটি বৈধ পদ্ধতি। ডাউনটাতে কেন এমনটা হয়?
m3nda

2

পূর্বের
উত্তরে উল্লিখিত দির (মডিউল) বা সহায়তা (মডিউল) বাদে আপনিও চেষ্টা করতে পারেন: - আইপিথন খুলুন
- মডিউল_নাম আমদানি করুন
- মডিউল_নাম টাইপ করুন, ট্যাব টিপুন। এটি অজগর মডিউলে সমস্ত ফাংশন তালিকাভুক্ত করে একটি ছোট উইন্ডো খুলবে।
এটি খুব ঝরঝরে দেখাচ্ছে।

হ্যাশলিব মডিউলের সমস্ত ফাংশন তালিকাভুক্ত এখানে রয়েছে

(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

এটি আপনার তালিকায় আপনার_মডিউলে সংজ্ঞায়িত সমস্ত ফাংশন যুক্ত করবে।

result=[]
for i in dir(your_module):
    if type(getattr(your_module, i)).__name__ == "function":
        result.append(getattr(your_module, i))

এই কি unit8_conversion_methods? এটি কি মডিউল নামের একটি উদাহরণ?
নসিবিম্বি

@ নোসিবাম্বি হ্যাঁ এটি কেবলমাত্র একটি মডিউল নাম।
মণীশ কুমার

2
ধন্যবাদ মনীষ আমি নিম্নলিখিত এক-লাইন বিকল্প প্রস্তাব করছি:[getattr(your_module, func) for func in dir(your_module) if type(getattr(your_module, func)).__name__ == "function"]
amine

0

শেল থেকে আপনার মডিউলের সমস্ত ফাংশনগুলির তালিকা পেতে আপনি নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন:

import module

module.*?

1
@ গ্যাব্রিয়েলফায়ার আপনি কোন সংস্করণ / প্ল্যাটফর্মটি অজগরটি চালাচ্ছেন? আমি পাই .7. / / উইন ১০ এ একটি সিনট্যাক্স ত্রুটি পেয়েছি।
টুনআরমাইক্যাপ্টেন

0
import sys
from inspect import getmembers, isfunction
fcn_list = [o[0] for o in getmembers(sys.modules[__name__], isfunction)]

0
r = globals()
sep = '\n'+100*'*'+'\n' # To make it clean to read.
for k in list(r.keys()):
    try:
        if str(type(r[k])).count('function'):
            print(sep+k + ' : \n' + str(r[k].__doc__))
    except Exception as e:
        print(e)

আউটপুট:

******************************************************************************************
GetNumberOfWordsInTextFile : 

    Calcule et retourne le nombre de mots d'un fichier texte
    :param path_: le chemin du fichier à analyser
    :return: le nombre de mots du fichier

******************************************************************************************

    write_in : 

        Ecrit les donnees (2nd arg) dans un fichier txt (path en 1st arg) en mode a,
        :param path_: le path du fichier texte
        :param data_: la liste des données à écrire ou un bloc texte directement
        :return: None


 ******************************************************************************************
    write_in_as_w : 

            Ecrit les donnees (2nd arg) dans un fichier txt (path en 1st arg) en mode w,
            :param path_: le path du fichier texte
            :param data_: la liste des données à écrire ou un bloc texte directement
            :return: None
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.