python - পিইপি 8-sys.path সহ ফাইলের শীর্ষে আমদানি করবেন না




python-3.x pep8 (4)

আপনি কি ইতিমধ্যে নিম্নলিখিত ব্যবহার করে দেখেছেন:

import sys
from importlib import import_module

sys.path.insert("..", 0)

# import module
my_mod = import_module('my_module')

# get method or function from my_mod
my_method = getattr(my_mod , 'my_method')

সমস্যা

পিইপি 8-র একটি ফাইলের শীর্ষে আমদানি করা সম্পর্কে একটি বিধি রয়েছে:

আমদানি সর্বদা ফাইলের শীর্ষে রাখা হয়, কেবল কোনও মডিউল মন্তব্য এবং ডকাস্ট্রিংয়ের পরে এবং মডিউল গ্লোবাল এবং ধ্রুবকগুলির আগে।

তবে, কিছু কিছু ক্ষেত্রে, আমি এর মতো কিছু করতে চাই:

import sys
sys.path.insert("..", 0)

import my_module

এই ক্ষেত্রে, pep8 কমান্ড লাইন ইউটিলিটি আমার pep8 ফ্ল্যাগ করে:

E402 মডিউল স্তরের আমদানি ফাইলের শীর্ষে নেই

sys.path পরিবর্তনগুলির সাথে sys.path সম্মতি অর্জনের সর্বোত্তম উপায় কী?

কেন

আমার এই কোডটি রয়েছে কারণ আমি পাইচনের দ্য হিচিকার গাইডে প্রদত্ত প্রকল্প কাঠামোটি অনুসরণ করছি।

সেই গাইডটি পরামর্শ দেয় যে আমার কাছে একটি my_module ফোল্ডার রয়েছে, যা tests ফোল্ডার থেকে পৃথক, উভয়ই একই ডিরেক্টরিতে রয়েছে। যদি আমি tests থেকে my_module অ্যাক্সেস করতে চাই তবে আমার মনে হয় আমাকে sys.path যোগ করা দরকার


আমি সবেমাত্র একটি অনুরূপ প্রশ্নের সাথে লড়াই করেছি এবং আমি মনে করি আমি গৃহীত উত্তরের চেয়ে কিছুটা সুন্দর সমাধান পেয়েছি।

প্রকৃত sys.path ম্যানিপুলেশন করে এমন একটি pathmagic মডিউল তৈরি করুন, তবে একটি প্রসঙ্গ পরিচালকের মধ্যে পরিবর্তন আনুন:

"""Path hack to make tests work."""

import os
import sys

class context:
    def __enter__(self):
        bp = os.path.dirname(os.path.realpath('.')).split(os.sep)
        modpath = os.sep.join(bp + ['src'])
        sys.path.insert(0, modpath)

    def __exit__(self, *args):
        pass

তারপরে, আপনার পরীক্ষার ফাইলগুলিতে (বা যেখানে আপনার এটি প্রয়োজন সেখানে), আপনি এটি করেন:

import pathmagic

with pathmagic.context():
    import my_module
    # ...

এইভাবে আপনি flake8 / পাইকোডাস্টাইল থেকে কোনও অভিযোগ পাবেন না, আপনার বিশেষ মন্তব্যের প্রয়োজন নেই, এবং কাঠামোটি বোধগম্য মনে হচ্ছে।

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

সম্পাদনা : একটি ভিন্ন প্রশ্নের উত্তরে assert pathmagic একটি সহজ কৌশলটি দেখেছেন: noqa মন্তব্য এড়াতে আপনার আমদানির অধীনে noqa করুন।


পিপ 8 এর সাথে সম্মতি জানাতে, আপেক্ষিক / নিখুঁত আমদানি করার জন্য আপনার অজগর পথে আপনার প্রকল্পের পথটি অন্তর্ভুক্ত করা উচিত।

এটি করার জন্য, আপনি এই উত্তরটি একবার দেখতে পারেন: স্থায়ীভাবে পাইথনপথে একটি ডিরেক্টরি যুক্ত করুন


প্রায়শই আমার কাছে আমার প্রকল্পের একটি উপ-ডিরেক্টরি foo/tests পরীক্ষা সহ একাধিক ফাইল থাকে, যখন আমি যে মডিউলগুলি পরীক্ষা করছি সেগুলি foo/src । আমদানি ত্রুটি ছাড়াই foo/tests টেস্টগুলি থেকে পরীক্ষা চালানোর জন্য আমি একটি ফাইল তৈরি করি foo/tests/pathmagic.py যা দেখতে দেখতে এটি;

"""Path hack to make tests work."""

import os
import sys

bp = os.path.dirname(os.path.realpath('.')).split(os.sep)
modpath = os.sep.join(bp + ['src'])
sys.path.insert(0, modpath)

প্রতিটি পরীক্ষার ফাইলে আমি তখন ব্যবহার করি

import pathmagic  # noqa

প্রথম আমদানি হিসাবে "নোকা" মন্তব্যটি অব্যবহৃত আমদানি সম্পর্কে অভিযোগ থেকে pycodestyle / pep8 pycodestyle প্রতিরোধ করে।







pep8