मैं पायथन में एक वर्ग के लिए फ़ाइलपथ कैसे प्राप्त करूं?


95

पायथन में एक वर्ग सी को देखते हुए, मैं यह कैसे निर्धारित कर सकता हूं कि कक्षा को किस फ़ाइल में परिभाषित किया गया था? मुझे ऐसी चीज़ की ज़रूरत है जो या तो क्लास C से काम कर सकती है, या C से एक उदाहरण से।

मैं यह कर रहा हूं, इसका कारण यह है कि मैं आमतौर पर एक ही फ़ोल्डर में एक साथ फाइल रखने वाली एक प्रशंसक हूं। मैं एक ऐसी क्लास बनाना चाहता हूं जो खुद को HTML के रूप में प्रस्तुत करने के लिए Django टेम्पलेट का उपयोग करता है। आधार कार्यान्वयन को फ़ाइलनाम के आधार पर फ़ाइलनाम को समझना चाहिए जो वर्ग में परिभाषित किया गया है।

मान लें कि मैंने "बेस / आर्टिफैक्ट्सी" फाइल में एक क्लास लोकेशनचरवर्क डाला है, तो मैं चाहता हूं कि डिफ़ॉल्ट व्यवहार यह हो कि टेम्पलेट का नाम "बेस / लोकेशन आर्टिफैक्ट.html" हो।



2
वे मान लेते हैं कि आप उस मॉड्यूल को जानते हैं जिसके लिए आप फ़ाइल देख रहे हैं, मेरे पास बस मॉड्यूल स्ट्रिंग होगा क्योंकि मैं एक वर्ग से कार्यान्वयन के साथ काम करता हूं।
स्टाले

जवाबों:


131

आप इस तरह से निरीक्षण मॉड्यूल का उपयोग कर सकते हैं :

import inspect
inspect.getfile(C.__class__)

1
निश्चित नहीं है कि मैं क्या कर रहा था, बल्कि getfileमुझे इसका इस्तेमाल करना था: inspect.getmodule(C.__class__)
AJP

4
नोट: उपयोगकर्ता द्वारा बनाई गई कक्षाओं पर काम नहीं करता है
डैनियल ब्रौन

7
यह शायद होना चाहिए inspect.getfile(C)। यदि Cएक वर्ग है, तो C.__class__संदर्भित करता है object, जो एक अपवाद को बढ़ाएगा TypeError: <module 'builtins' (built-in)> is a built-in class। मुझे लगता है कि केवल एक उदाहरण के cलिए आप उपयोग करना चाहते हैं inspect.getfile(c.__class__)
चेशायरकोव

1
यह एक ऐसे वर्ग के लिए नहीं था जो एक सार आधार वर्ग ( metaclass=abc.ABCMeta) का विस्तार करता है , क्योंकि यह /usr/local/lib/python3.7/abc.pyउपयुक्त फ़ाइल के बजाय वापस आता है । @JarretHardie (नीचे) द्वारा समाधान ने बेहतर काम किया।
Martian111

36

प्रयत्न:

import sys, os
os.path.abspath(sys.modules[LocationArtifact.__module__].__file__)

1
सी की एक आवृत्ति से रास्ता पाने के लिए (ओपी द्वारा वांछित), जहां obj LocationArtifact का एक उदाहरण है के LocationArtifactसाथ बदलें obj.__class__
martian111

5

यह Django और वास्तव में चीजों को मजबूर करने के लिए गलत दृष्टिकोण है।

विशिष्ट Django ऐप पैटर्न है:

  • / परियोजना
    • /एप्लिकेशन का नाम
      • models.py
      • views.py
      • / टेम्पलेट्स
        • index.html
        • आदि।

1
+1: जोंगो स्वाभाविक रूप से करता है और जीवन इतना सरल है।
एस.लॉट

1
माना। Django कम से कम "जादू" के साथ चौखटे में से एक है, लेकिन टेम्प्लेट, टेम्प्लेट टैग और ऐप्स में उनके पैटर्न के हिस्से के रूप में कुछ अपेक्षाएं हैं। यदि आप निराला वर्ग अनुमान लगा रहे हैं तो आप शायद गलत दिशा में जा रहे हैं।
सोवियुत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.