प्लगइन केस स्टडी: प्लगी – एली बेंडरस्कीची वेबसाइट

प्लगइन केस स्टडी: प्लगी – एली बेंडरस्कीची वेबसाइट


अलीकडेच मी Pluggy वर आलो, प्लगइन सिस्टम विकसित करण्यासाठी Python लायब्ररी. हे मूलतः भाग म्हणून विकसित केले गेले pytest प्रकल्प – त्याच्या समृद्ध प्लगइन इकोसिस्टमसाठी ओळखला जातो – आणि नंतर स्टँडअलोन लायब्ररीमध्ये काढला. तुम्हाला तुमच्या टूल किंवा लायब्ररीमध्ये प्लगइन सिस्टम जोडायची असल्यास आणि तुमच्या स्वत:चा रोल करण्याऐवजी सिद्ध केलेले काहीतरी वापरायचे असल्यास तुम्हाला प्लग्गीशी संपर्क साधावा लागेल.

या पोस्टमध्ये मी प्लगी कसे कार्य करते यावर काही टिपा सामायिक करेन आणि नंतर ते प्लगइन इन्फ्रास्ट्रक्चरच्या मूलभूत संकल्पनांशी कसे संरेखित होते याचे पुनरावलोकन करेन.

प्लगइन केस स्टडी: प्लगी – एली बेंडरस्कीची वेबसाइट

प्लगी वापरणे

च्या संकल्पनेभोवती प्लगी बांधले आहे हुक: फंक्शन्स जे होस्ट ऍप्लिकेशन्स किंवा टूल्स (येथून, फक्त “होस्ट”) एक्सपोज करतात आणि प्लगइन्स अंमलात आणतात. यजमान परत आलेल्या डेकोरेटरचा वापर करून हुक उघड करतो pluggy.HookspecMarker आणि एक प्लगइन या हुकमधून परत आलेल्या डेकोरेटरचा वापर करते pluggy.HookimplMarker.

प्लगीचे दस्तऐवजीकरण हे बऱ्यापैकी स्पष्ट करते; या पोस्टमध्ये, मी कसे अंमलात आणायचे ते दर्शवू htmlize माझ्या प्लगइन मालिकेतील मूळ लेखात सादर केलेले काही प्लगइन असलेले साधन.

आठवण म्हणून, htmlize हे एक टॉय टूल आहे जे restructuredText प्रमाणेच मार्कअप नोटेशन घेते आणि ते HTML मध्ये रूपांतरित करते. हे सानुकूल “भूमिका” हाताळण्यासाठी प्लगइनना समर्थन देते जसे:

some text :role:`customized text` and more text

तसेच प्लगइन जे संपूर्ण मजकूरावर अनियंत्रित प्रक्रिया करतात.

हुक परिभाषित करणे

आउट होस्ट दोन हुक परिभाषित करतो:

import pluggy

hookspec = pluggy.HookspecMarker("htmlize")

@hookspec(firstresult=True)
def htmlize_role_handler(role_name):
    """Return a function accepting role contents.

    The function will be called with a single argument - the role contents, and
    should return what the role gets replaced with.
    """
    pass

@hookspec
def htmlize_contents(post, db):
    """Return a function accepting full document contents.

    The function will be called with a single argument - the document contents
    (after paragraph splitting and role processing), and should return the
    transformed contents.
    """
    pass

कॉल करून एक हुक तयार केला जातो हुकस्पेक मार्कर प्रकल्पाच्या नावासह. या प्रकल्पाचे नाव होस्ट आणि त्याचे प्लगइन यांच्यात जुळले पाहिजे. हुक पॅरामीटर्स म्हणून काय स्वीकारतात आणि ते काय परत करतात याबद्दल प्लगी परवानगी आहे; जास्तीत जास्त लवचिकतेसाठी आणि मूळवर खरे राहण्यासाठी htmlize उदाहरणार्थ, आमचे हुक रिटर्न फंक्शन्स.

या सोबत हुकस्पेक मार्करहोस्ट देखील परिभाषित करतो a हुकिम्पलमार्कर त्याच नावाने:

hookimpl = pluggy.HookimplMarker("htmlize")

हे प्लगइन लोड झाल्यावर हुक जोडण्यासाठी वापरले जाते.

होस्टमध्ये प्लगइन लोड करत आहे

होस्टचे मुख्य फंक्शन स्टार्टअपवर खालीलप्रमाणे प्लगइन लोड करते:

pm = pluggy.PluginManager("htmlize")
pm.add_hookspecs(hookspecs)
pm.load_setuptools_entrypoints("htmlize")

हुकस्पेक्स आमचे पायथन मॉड्यूल आहे ज्यामध्ये वर दर्शविलेले हुक आहेत.
load_setuptools_entrypoints प्लगइन लोड करण्यासाठी प्लगीचा मदतनीस आहे pip-समान वातावरणात स्थापित आणि सेटअप टूल्स एंट्री पॉइंट म्हणून नोंदणीकृत. हे सिग्नल करण्याचा एक मार्ग आहे – एखाद्याच्या मध्ये setup.py किंवा pyproject.toml फाइल – काही मेटाडेटा ज्याचे प्रोजेक्ट रनटाइममध्ये पुनरावलोकन करू शकतात. आमच्या प्रकल्पात, प्लगइन या विभागात स्वतःची नोंदणी करतात pyproject.toml फाइल:

(project.entry-points.htmlize)
tt = "tt"

हे म्हणतात “प्रवेश बिंदूसाठी htmlizeनावाची नवीन नोंद परिभाषित करा tt“. प्लगीज load_setuptools_entrypoints नंतर ही माहिती ऍक्सेस करण्यासाठी importlib.metadata वापरते.

लक्षात ठेवा की प्लगीला ही यंत्रणा वापरण्याची आवश्यकता नाही. यजमान त्यांना हवी असलेली कोणतीही प्लगइन शोध पद्धत लागू करू शकतात आणि त्यांच्यामध्ये थेट प्लगइन जोडू शकतात
प्लगइन मॅनेजर सह नोंदणी करा पद्धत पण यासाठी वापरली जाणारी यंत्रणा आहे pytest आणि इतर अनेक प्रकल्प; हे स्थापित केलेले प्लगइन स्वयंचलितपणे शोधणे आणि नोंदणी करणे खूप सोपे करते pip आणि समतुल्य साधने.

प्लगइन्सची विनंती करत आहे

एकदा प्लगइन मॅनेजर प्लगइन लोड करते, त्यांना आवाहन करणे सोपे आहे; कसे ते येथे आहे htmlize सामग्री हुक आमंत्रित करते:

# Build full contents back again, and ask plugins to act on
# contents.
contents = ''.join(parts)
for handler in plugin_manager.hook.htmlize_contents(post=post, db=db):
    contents = handler(contents)
return contents

साधारणपणे, हुक इनव्होकेशन रिटर्न a यादी वेगवेगळ्या प्लगइन्सद्वारे जोडलेल्या सर्व हुकपैकी (एकाच होस्ट ऍप्लिकेशनमध्ये एकाधिक प्लगइन स्थापित केले जाऊ शकतात आणि त्याच हुकला जोडले जाऊ शकतात). जेव्हा होस्ट वर दर्शविल्याप्रमाणे हुक लावतो तेव्हा डीफॉल्ट ऑर्डर LIFO असते, परंतु प्लगइन हुक पर्यायांसह प्रभावित करू शकतात. प्रथम प्रयत्न करा आणि ट्रायलास्ट.

प्लगइनमध्ये हुक लागू करणे

येथे आमचे संपूर्ण आहे narcissist सामग्री हुकशी संलग्न असलेले प्लगइन:

import htmlize

@htmlize.hookimpl
def htmlize_contents(post, db):
    repl = f'I ({post.author})'

    def hook(contents):
        return re.sub(r'\bI\b', repl, contents)

    return hook

काही टिपा:

  • अपेक्षा करतो htmlize स्थापित करणे; आधी चर्चा केल्याप्रमाणे, आम्ही Pluggy च्या डीफॉल्ट इंस्टॉल-आधारित पध्दतीवर अवलंबून आहोत जेथे होस्ट आणि प्लगइन दोन्ही एकाच Python वातावरणात स्थापित केले जातात आणि अशा प्रकारे एकमेकांना शोधू शकतात. तथापि, प्लगी कोणत्याही सानुकूल शोध पद्धतीचे समर्थन करते.
  • ते वापरते हुकिमप्ल पूर्वी दर्शविलेले निर्यात मूल्य.
  • हे एक फंक्शन देते जे सामग्रीवर कार्य करते; हे आहे htmlize-विशिष्ट करार (एबीआय, जर तुम्ही कराल) आम्ही आधी चर्चा केली आहे.

या केस स्टडीमधील मूलभूत प्लगइन संकल्पना

Pluggy चा हा केस स्टडी या ब्लॉगवर अनेक वेळा कव्हर केलेल्या मूलभूत प्लगइन संकल्पनांवर कसा उपाय करतो ते पाहू या.

हे लक्षात ठेवणे महत्त्वाचे आहे की प्लगी हा बेस्पोक प्लगइन प्रणालीसह विशिष्ट होस्ट अनुप्रयोग नाही; त्याऐवजी, अशा प्लगइन सिस्टम तयार करण्यासाठी ही एक पुन्हा वापरता येण्याजोगी लायब्ररी आहे. म्हणून, हे अधिक आहे मेटा केस स्टडी.

शोध

साधारणपणे, प्लगी शोध तर्कशास्त्र वापरकर्त्याच्या विवेकबुद्धीनुसार सोडते. त्याची
प्लगइन मॅनेजर आहे नोंदणी करा प्लगइन जोडण्याची पद्धत, आणि हे अनुप्रयोग निवडलेल्या कोणत्याही मार्गाने शोधले जाऊ शकते.

असे म्हटले आहे की, Pluggy वर दर्शविल्याप्रमाणे, Python पॅकेजिंगच्या एंट्री पॉइंट प्रक्रियेद्वारे – एक शोध यंत्रणा अंगभूत आहे. मोठ्या संख्येने ऍप्लिकेशन्ससाठी हे अत्यंत सोयीचे आहे, जोपर्यंत ऍप्लिकेशन आणि त्याचे प्लगइन दोन्ही मानक पायथन पॅकेजिंग टूल्सद्वारे स्थापित केले जातात (जे पायथन इकोसिस्टममध्ये एक अतिशय वाजवी गृहीतक आहे).

नोंदणी

एंट्री पॉइंट प्रक्रियेत, प्लगइन्स a जोडून स्वतःची नोंदणी करतात
(project.entry-points.) त्यांच्या मध्ये विभाग pyproject.toml
फाइल

अन्यथा – मागील विभागाप्रमाणे – वापरकर्ते त्यांच्या स्वतःच्या नोंदणी योजना तयार करण्यास मोकळे आहेत.

हुक

हे एक सोपे आहे, कारण ते म्हणतात हुक प्लगी भाषेतही! प्लगइन्स सेट करण्यासाठी प्लगइन्ससाठी फंक्शन डेकोरेटर्ससह, हुकची अंमलबजावणी खूपच सुंदर आहे. याचे उदाहरण आपण वर पाहिले आहे
@htmlize.hookimpl सजावट htmlize_contents.

प्लगइनवर अनुप्रयोग API उघड करणे

Pluggy हे Python होस्ट आणि Python प्लगइनसाठी डिझाइन केलेले असल्याने, हे अगदी सरळ आहे. प्लगइन्स सहसा असे गृहीत धरतात की होस्ट प्रोजेक्ट आधीपासूनच पायथन वातावरणात स्थापित केलेला आहे आणि त्याचे मॉड्यूल आयात केले जाऊ शकतात.

आमच्या उदाहरणात, हुकिमप्ल पासून आयात केले जाते htmlize हे पूर्ण करण्यासाठी प्लगइनद्वारे. हे प्लगइनवर होस्ट डेटा कसा पास केला जातो हे देखील दर्शविते – द
पोस्ट आणि db पॅरामीटर्स हे प्लगइन्सच्या वापरासाठी होस्टद्वारे उघड केलेले API आहेत.

निष्कर्ष – प्लगी हे योग्य आहे का?

प्लगइन इन्फ्रास्ट्रक्चर पोस्टच्या माझ्या मूळ मूलभूत संकल्पनांच्या तळटीप 2 मध्ये, मी लिहिले:

त्यामुळेच कदाचित फार कमी सु-स्थापित प्लगइन फ्रेमवर्क अस्तित्वात आहेत (अगदी C किंवा C++ सारख्या निम्न-स्तरीय भाषांमध्येही). आपले स्वतःचे रोल करणे खूप सोपे (आणि मोहक) आहे.

मला अजूनही विश्वास आहे की माझे विधान सत्य आहे – प्लगइन फ्रेमवर्क तयार करणे खूप सोपे आहे आणि ते प्रदान केलेली कार्यक्षमता त्यांच्या मोठ्या पृष्ठभागाच्या तुलनेत तुलनेने लहान आहे. दुसऱ्या शब्दांत, हे ए उथळ API.

ते म्हणाले, प्लगइनच्या अधिक प्रगत वापरांसाठी प्लगी काही छान कार्यक्षमता प्रदान करते:

  • स्वयंचलित एंट्री पॉइंट नोंदणी यंत्रणा – जर तुम्हाला त्याची गरज असेल
  • स्वाक्षरी प्रमाणीकरण
  • एकाच प्लगइनमधील एकाधिक हुक संलग्नकांवर आणि अनेक प्लगइनवर सातत्यपूर्ण प्लगइन परिणाम संग्रह
  • सह ऑर्डरिंग प्लगइन पहिला परिणाम, प्रथम प्रयत्न करा, ट्रायलास्टइ.
  • काही विशेष वापराच्या प्रकरणांसाठी हुक “रॅपर्स”.

तुमच्या प्रकल्पासाठी हे फायदेशीर आहेत का? हे खरोखर प्रकल्पावर अवलंबून असते, आणि अवलंबित्व आणि प्रकल्प प्रयत्न यांच्यातील ट्रेडऑफ लक्षात ठेवणे नेहमीच फायदेशीर असते.



Source link

Postagens Similares

  • Jessica Chastain sagt, dass Apple TV The Savant endlich veröffentlichen wird

    Jessica Chastain sagt, dass Apple TV endlich ihre Politthrillerserie „The Savant“ veröffentlichen wird. Die Premiere sollte im September 2025 stattfinden, wurde jedoch nach der Ermordung von Charlie Kirk verschoben. Der Oscar-Preisträger spielt in der Serie die Hauptrolle eines Ermittlers, der verdeckt im Dark Web unterwegs ist, um Hassgruppen aufzuspüren und inländischen Terrorismus zu verhindern. „Früher…

  • 为什么我认为VC现在陷入严重麻烦

    这就是为什么我认为VC作为一种物种,现在陷入严重麻烦的原因。 需要风投的主要原因是,通常不可能创办公司并在没有大量前期资本的情况下建立产品。现在事实并非如此。而且越容易获得的VC所需的VC。 整个生态系统都是基于稀缺性的。创始人很少。很少的想法。很少的公司。同样,情况不再如此。 当有100倍的公司进行评估时,很难选择获奖者。 最激动人心的公司的创始人不太可能接听电话。有一个很小的时刻1)这样的公司需要用VC钱进行扩展,而2)其他人尚未利用。 许多VC仍在花费时间来管理现在正在摇动的多家旧版公司。这些公司中的许多公司将在未来5年内倒闭。 与您回来的人的竞争现在更强大10-100倍,因此您的赌注甚至不太保证。 所以: 仍然需要VC。但是绝大多数公司都需要它们,现在这将是少数。 找到需要您的小比例更难。 即使您找到某人…他们需要更少的帮助,给您较低的回报,他们将面临更强大的竞争。 仍然有可能获得胜利,但我认为这个空间看起来并不好。 笔记 AIL 1级:丹尼尔写了整个作品。我(Kai,他的DA)帮助了格式化和图像处理。了解有关AIL的更多信息 Source link

  • மாண்டன் ரீஸ் – AI மற்றும் விக்கிபீடியா

    விக்கிபீடியாவின் இந்த அறிவிப்பு சில விவாதங்களைத் தூண்டியது. இது நல்ல செய்தி மட்டுமே என்று நினைக்கிறேன். ஒரு நிறுவனம் விக்கிப்பீடியாவிலிருந்து குறிப்பிடத்தக்க வகையில் பயனடைகிறது மற்றும் ஹோஸ்டிங் செலவுகளை ஈடுகட்ட உதவ முடியும் என்றால், அவர்கள் செய்ய வேண்டும். அறிவிப்பிலிருந்து: விக்கிபீடியா உள்ளடக்கத்தை நம்பியிருக்கும் தொழில்நுட்ப நிறுவனங்கள் அதை பொறுப்புடன் பயன்படுத்த வேண்டும் மற்றும் எதிர்காலத்தில் விக்கிப்பீடியாவை நிலைநிறுத்த உதவ வேண்டும். இதைச் செய்வதற்கான ஒரு முக்கிய வழி விக்கிமீடியா எண்டர்பிரைஸ் ஆகும். விக்கிமீடியா அறக்கட்டளையால் உருவாக்கப்பட்டது,…

  • Vi introduserer GPT‑5.3‑Codex‑Spark

    Vi introduserer GPT‑5.3‑Codex‑Spark. OpenAI annonserte et partnerskap med Cerebras 14. januar. Fire uker senere lanserer de allerede den første integrasjonen, “en ultrarask modell for sanntidskoding i Codex”. Til tross for at det heter GPT-5.3-Codex-Spark, er det ikke et rent akselerert alternativ til GPT-5.3-Codex – blogginnlegget kaller det “en mindre versjon av GPT-5.3-Codex” og klargjør at…

  • Biaya Inferensi Tidak Berkelanjutan

    Ya, sekarang saya menyelesaikan seperempat langganan MAX minggu saya dalam beberapa jam bekerja dengan Claude Code. Menurutku Anthropic itu pintar, dan menurutku mereka tidak mencoba menipu kita. Saya pikir sejujurnya mereka hanya mencoba menyelaraskan tuduhan inferensi dengan kenyataan. Dan hal ini harus menjadi peringatan bagi kita semua. Saya pikir kita akan membutuhkan multi-model harness (atau…

  • 用 Go 編寫的 Parrot AR 無人機 2.0​​ 固件 Felix Geisendörfer

    GoDrone – 用 Go 編寫的 Parrot AR 無人機 2.0​​ 固件 · Felix Geisendörfer 發表: 2013 年 12 月 25 日 大家聖誕快樂(或者牛頓聖誕,如果你願意的話)。 今天,我很高興發布我最喜歡的副項目 GoDrone 的第一個版本。 GoDrone 是 Parrot AR Drone 2.0 的免費軟件替代固件。是的,這有望使其成為 Go 垃圾收集器的第一個機器人可視化工具:)。 此時,固件已經足夠好,可以飛行並提供基本的姿態穩定(使用簡單的互補濾波器+PID控制器),所以我真的很想從任何喜歡冒險的AR無人機所有者那裡得到反饋。我為 OSX/Linux/Windows 提供二進制安裝程序: http://www.godrone.io/en/latest/index.html 但您也可以選擇從源安裝。 根據最初的反饋,我很樂意將 GoDrone 變成官方固件的可行替代品,並為機器人軟件的開髮帶來一些新鮮空氣。我特別想展示的是,網絡技術在為機器人提供用戶界面的成本和用戶體驗方面可以與本地移動/桌面應用程序相媲美,而且我還想推廣使用高級語言在 Linux 驅動的機器人中進行固件開發的想法。 如果您有興趣,請確保加入郵件列表/在 IRC 中打個招呼: http://www.godrone.io/en/latest/user/community_support.html ——菲利克斯·蓋森多夫 通過 RSS 或電子郵件訂閱此博客,或者通過以下方式獲取我的小更新 嘰嘰喳喳。 請啟用 JavaScript 以查看…

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *