পাইথনে বর্তমান মডিউলটির বৈশিষ্ট্যগুলির একটি রেফারেন্স কীভাবে পাবেন


119

আমি যা করার চেষ্টা করছি তা কমান্ড লাইনে এমন দেখাবে:

>>> import mymodule
>>> names = dir(mymodule)

নিজের mymoduleমধ্যে mymoduleথেকেই সংজ্ঞায়িত সমস্ত নামগুলির কীভাবে আমি একটি রেফারেন্স পেতে পারি ?

এটার মতো কিছু:

# mymodule.py
names = dir(__thismodule__)

এছাড়াও চেক করুন stackoverflow.com/questions/3281300/...
ksridhar

উত্তর:


135

শুধু গ্লোবাল ব্যবহার করুন ()

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

http://docs.python.org/library/functions.html#globals


4
সংজ্ঞায়িত মডিউলটির পরিবর্তে কলিং মডিউলটির গ্লোবালগুলি () অ্যাক্সেস করার কোনও উপায় আছে?
dimo414

9
আপনি ট্রেসব্যাক মডিউল ( ডকস.পিথন.আর / লাইবারি / ট্র্যাকব্যাক html ) থেকে কলারের গ্লোবালগুলি পেতে চেষ্টা করতে পারেন তবে এটি অন্ধকার যাদু অঞ্চলে intoুকছে । আপনি কী করতে চাইছেন তা আমি জানি না, তবে আপনার যদি প্রয়োজন হয় তবে আপনি নিজের নকশাটি পুনর্বিবেচনা করতে চাইতে পারেন।
ম্যাকিয়েজ পাস্টারনাকি

"আমার এক্স দরকার (ওয়াই করানোর জন্য) -> আপনার এক্স দরকার নেই আপনার জেড দরকার" এর একটি ক্লাসিক কেস। আমি যদিও এক্স প্রয়োজন! কোনও অপরাধ নয়, আমি কেবল এই
মজাদারকে

জেনে রাখা গুরুত্বপূর্ণ যে গ্লোবালগুলি () ভুল বলা যেতে পারে কারণ এটি যেখানে ডাকা হচ্ছে সেই প্রসঙ্গে নির্ভর করে। উদাহরণস্বরূপ, যদি কোনও ক্লাস ফাংশন থেকে কল করা হয়, তবে এটি ক্লাসের সাথে যুক্ত বৈশ্বিক প্রসঙ্গটি ফিরিয়ে দেবে, বর্তমান মডিউল প্রসঙ্গটি নয়, যা প্রতীকীভাবে পৃথক জিনিস। এমনকি যদি ফ্রি ফাংশন থেকে কল করা হয় তবে এটি কীভাবে আমদানি করা হয়েছে তার উপর নির্ভর করে একটি ভিন্ন মডিউল গ্লোবাল প্রসঙ্গ ফিরে আসতে পারে।
অ্যান্ড্রি 15

163

পূর্বে উল্লিখিত হিসাবে, গ্লোবালগুলি আপনাকে ডিয়ার () এর বিপরীতে একটি অভিধান দেয় যা আপনাকে মডিউলে সংজ্ঞায়িত নামের একটি তালিকা দেয়। আমি সাধারণত যেভাবে দেখি তা এইরকম:

import sys
dir(sys.modules[__name__])

2
আমি একটি মন্তব্য যুক্ত করতে যাচ্ছিলাম যে এটি ' মূল ' মডিউলটির জন্য কাজ করবে না (যা টার্মিনালে চালিত মডিউলটি বলে) কারণ এটি সিস্টেমেডগুলি তালিকাভুক্ত বলে মনে হয় না - তবে এটি কার্যকরভাবে কাজ করে না :)
শুক্রবার

তবে এটি আইপিডিবি (আপনার ফাইলের মধ্যে "আমদানি আইপিডিবি; ipdb.set_trace ()" সন্নিবেশ করানো) থেকে কাজ করবে বলে মনে হচ্ছে না।
gatoatigrado

9
অসাধারণ! এটি আমাকে কেবলমাত্র বর্তমান মডিউলটির ডক্ট্রিংকে ব্যবহারের বার্তা হিসাবে ব্যবহার করার অনুমতি দিয়েছে - sys.modules[__name__].__doc__
জর্জে

এবং সুপার হ্যাকি পেতে। operators.attrgetter('module.attribute')(sys.modules[__name__])- আপনি কি জানেন যে আপনি যদি ক্রেজি কিছু করেন তবে লোকেরা আপনাকে স্ট্রিং থেকে প্যাকেজগুলি গতিশীলভাবে আমদানি করতে পছন্দ করে না এবং তারপরে কোনও শ্রেণিতে বা কোনও কিছুর মধ্যে না থাকার সময় বানরগুলি প্যাচ করে দেয় ...
কেসি

2
যে কেউ জর্জ দ্বারা মন্তব্য পড়ছেন: sys.modules[__name__].__doc__== __doc__এটি বর্তমান নেমস্পেসে সংজ্ঞায়িত করা হয়েছে। নিজস্ব বৈশিষ্ট্য অ্যাক্সেস করতে মডিউল অবজেক্টটি আনতে অতএব প্রয়োজনীয় নয়।
অলিভার বেস্টওয়াল্টার

1

উত্তর দিতে দেরি হতে পারে তবে আমি নিজের জন্য সঠিক উত্তর খুঁজে পাইনি। অজগরটির সবচেয়ে নিকটতম এবং সুনির্দিষ্ট সমাধান (এর চেয়ে দ্রুত inspect.stack()) 3.7.x:

  # search for first module in the stack
  stack_frame = inspect.currentframe()
  while stack_frame:
    print('***', stack_frame.f_code.co_name, stack_frame.f_code.co_filename, stack_frame.f_lineno)
    if stack_frame.f_code.co_name == '<module>':
      if stack_frame.f_code.co_filename != '<stdin>':
        caller_module = inspect.getmodule(stack_frame)
      else:
        # piped or interactive import
        caller_module = sys.modules['__main__']
      if not caller_module is None:
        #... do something here ...
      break
    stack_frame = stack_frame.f_back

পেশাদাররা :

  • পদ্ধতির চেয়ে প্রাক্চিয়র globals()
  • স্ট্যাক ইন্টারমিডিয়েট ফ্রেমের উপর নির্ভর করে না, যা উদাহরণস্বরূপ, হুকিংয়ের মাধ্যমে বা 3 ডি পার্টির সরঞ্জামগুলির মাধ্যমে যুক্ত করা যেতে পারে pytest:
*** foo ... ..
*** boo ... ..
*** runtest c:\python\x86\37\lib\site-packages\xonsh\pytest_plugin.py 58
*** pytest_runtest_call c:\python\x86\37\lib\site-packages\_pytest\runner.py 125
*** _multicall c:\python\x86\37\lib\site-packages\pluggy\callers.py 187
*** <lambda> c:\python\x86\37\lib\site-packages\pluggy\manager.py 86
*** _hookexec c:\python\x86\37\lib\site-packages\pluggy\manager.py 92
*** __call__ c:\python\x86\37\lib\site-packages\pluggy\hooks.py 286
*** <lambda> c:\python\x86\37\lib\site-packages\_pytest\runner.py 201
*** from_call c:\python\x86\37\lib\site-packages\_pytest\runner.py 229
*** call_runtest_hook c:\python\x86\37\lib\site-packages\_pytest\runner.py 201
*** call_and_report c:\python\x86\37\lib\site-packages\_pytest\runner.py 176
*** runtestprotocol c:\python\x86\37\lib\site-packages\_pytest\runner.py 95
*** pytest_runtest_protocol c:\python\x86\37\lib\site-packages\_pytest\runner.py 80
*** _multicall c:\python\x86\37\lib\site-packages\pluggy\callers.py 187
*** <lambda> c:\python\x86\37\lib\site-packages\pluggy\manager.py 86
*** _hookexec c:\python\x86\37\lib\site-packages\pluggy\manager.py 92
*** __call__ c:\python\x86\37\lib\site-packages\pluggy\hooks.py 286
*** pytest_runtestloop c:\python\x86\37\lib\site-packages\_pytest\main.py 258
*** _multicall c:\python\x86\37\lib\site-packages\pluggy\callers.py 187
*** <lambda> c:\python\x86\37\lib\site-packages\pluggy\manager.py 86
*** _hookexec c:\python\x86\37\lib\site-packages\pluggy\manager.py 92
*** __call__ c:\python\x86\37\lib\site-packages\pluggy\hooks.py 286
*** _main c:\python\x86\37\lib\site-packages\_pytest\main.py 237
*** wrap_session c:\python\x86\37\lib\site-packages\_pytest\main.py 193
*** pytest_cmdline_main c:\python\x86\37\lib\site-packages\_pytest\main.py 230
*** _multicall c:\python\x86\37\lib\site-packages\pluggy\callers.py 187
*** <lambda> c:\python\x86\37\lib\site-packages\pluggy\manager.py 86
*** _hookexec c:\python\x86\37\lib\site-packages\pluggy\manager.py 92
*** __call__ c:\python\x86\37\lib\site-packages\pluggy\hooks.py 286
*** main c:\python\x86\37\lib\site-packages\_pytest\config\__init__.py 90
*** <module> c:\Python\x86\37\Scripts\pytest.exe\__main__.py 7
  • পাইথন পাইপড বা ইন্টারেক্টিভ সেশন পরিচালনা করতে পারে।

কনস:

  • এক ধরণের সুনির্দিষ্ট এবং এক্সিকিউটেবলের মতো নিবন্ধিত মডিউলগুলি ফিরিয়ে দিতে pytest.exeপারে যা আপনি যা চান তা নাও পারে।
  • inspect.getmodule হুকিংয়ের উপর নির্ভর করে বৈধ মডিউলগুলিতে কোনওটিই ফেরত দিতে পারে না

অজগরটিতে আমার একটি এক্সটেনশান রয়েছে: পুরো পথটি দিয়ে মডিউল কীভাবে আমদানি করব?

এই ক্ষেত্রে এক্সটেনশনের মোড়কের কাজ রয়েছে:

def tkl_get_stack_frame_module_by_offset(skip_stack_frames = 0, use_last_frame_on_out_of_stack = False):
  ...

def tkl_get_stack_frame_module_by_name(name = '<module>'):
  ...

আপনাকে কেবল এক্সটেনশনটি সঠিকভাবে শুরু করতে হবে:

# portable import to the global space
sys.path.append(<path-to-tacklelib-module-directory>)
import tacklelib as tkl

tkl.tkl_init(tkl, global_config = {'log_import_module':os.environ.get('TACKLELIB_LOG_IMPORT_MODULE')})

# cleanup
del tkl # must be instead of `tkl = None`, otherwise the variable would be still persist
sys.path.pop()

# use `tkl_*` functions directly from here ...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.