আমি কীভাবে ভাল / সঠিক প্যাকেজ __init__.py ফাইল লিখতে পারি


187

আমার প্যাকেজের নিম্নলিখিত কাঠামো রয়েছে:

mobilescouter/
    __init__.py #1
    mapper/
        __init__.py  #2
        lxml/
            __init__.py #3
            vehiclemapper.py
            vehiclefeaturemapper.py
            vehiclefeaturesetmapper.py
        ...
        basemapper.py
   vehicle/
        __init__.py #4
        vehicle.py
        vehiclefeature.py
        vehiclefeaturemapper.py
   ...

__init__.pyফাইলগুলি কীভাবে সঠিকভাবে লেখা উচিত তা আমি নিশ্চিত নই । দেখে মনে হচ্ছে:
__init__.py #1

__all__ = ['mapper', 'vehicle']
import mapper
import vehicle

তবে উদাহরণস্বরূপ __init__.py #2দেখতে কেমন হওয়া উচিত ? খনিটি হ'ল:

__all__ = ['basemapper', 'lxml']
from basemaper import *
import lxml

কখন __all__ব্যবহার করা উচিত ?


2
সচেতন থাকুন যদিও কোডে আমদানি * ব্যবহার করা খুব খারাপ অভ্যাস এবং সম্ভব হলে এড়ানো উচিত। এর জন্য খুব ভাল ব্যবহারের কেস খুব কম, তবে এগুলি সত্যই বিরল।
মায়ু 36

পিএসএ: আপনি যদি ভাল নেমস্পেস প্যাকেজগুলি (নতুন ধরণের প্যাকেজ) লিখতে শিখতে আগ্রহী হন তবে এই উদাহরণ প্যাকেজটি দেখুন: github.com/pypa/sample-namespace-packages
কাইল

উত্তর:


145

__all__খুব ভাল - এটি স্বয়ংক্রিয়ভাবে মডিউলগুলি আমদানি না করে আমদানি বিবরণীদের গাইড করতে সহায়তা করে http://docs.python.org/tutorial/modules.html#importing-from-a-package

ব্যবহার __all__এবং import *অপ্রয়োজনীয়, শুধুমাত্র __all__প্রয়োজন

আমি মনে করি প্যাকেজগুলি আমদানিতে ব্যবহার করার সবচেয়ে শক্তিশালী কারণগুলির import *মধ্যে একটি __init__.pyহ'ল কোনও বিদ্যমান স্ক্রিপ্টগুলিতে বিদ্যমান অ্যাপ্লিকেশনটি না ভেঙে একাধিক স্ক্রিপ্টে পরিণত হওয়া একটি স্ক্রিপ্টটি রিফ্যাক্টর করতে সক্ষম। তবে আপনি যদি প্রথম থেকেই কোনও প্যাকেজ ডিজাইন করেন। আমি মনে করি __init__.pyফাইল খালি রাখা ভাল।

উদাহরণ স্বরূপ:

foo.py - contains classes related to foo such as fooFactory, tallFoo, shortFoo

তারপরে অ্যাপটি বাড়বে এবং এখন এটি পুরো ফোল্ডার

foo/
    __init__.py
    foofactories.py
    tallFoos.py
    shortfoos.py
    mediumfoos.py
    santaslittlehelperfoo.py
    superawsomefoo.py
    anotherfoo.py

তাহলে init স্ক্রিপ্ট বলতে পারে

__all__ = ['foofactories', 'tallFoos', 'shortfoos', 'medumfoos',
           'santaslittlehelperfoo', 'superawsomefoo', 'anotherfoo']
# deprecated to keep older scripts who import this from breaking
from foo.foofactories import fooFactory
from foo.tallfoos import tallFoo
from foo.shortfoos import shortFoo

যাতে নিম্নলিখিতটি করার জন্য লিখিত কোনও স্ক্রিপ্ট পরিবর্তনের সময় ভঙ্গ না হয়:

from foo import fooFactory, tallFoo, shortFoo

3
আমি ' সমস্ত ' এবং লাইন বাই লাইন আমদানি সম্পর্কে খুব বিভ্রান্ত ছিলাম । আপনার উদাহরণটি খুব আলোকিত।
জুনচেন

2
আমি " __all__এবং import *অপ্রয়োজনীয়" দ্বারা বিভ্রান্ত , __all__মডিউলটির গ্রাহক from foo import *দ্বারা ব্যবহৃত হয় এবং মডিউলটি অন্যকে ব্যবহার করার জন্য নিজেই ব্যবহৃত হয় ....
নিক টি

using __all__ and import * is redundant, only __all__ is needed কীভাবে এই অপ্রয়োজনীয়? তারা বিভিন্ন কাজ করে।
এন্ডোলিথ

112

আমার নিজের __init__.pyফাইলগুলি প্রায়শই খালি থাকে। বিশেষ করে, আমি একটি কখনও from blah import *অংশ হিসেবে __init__.pyযদি ক্লাস সব বিষয়ে পেয়ে মানে হলো "প্যাকেজ আমদানি", ফাংশন ইত্যাদি সরাসরি সংজ্ঞায়িত প্যাকেজের অংশ হিসাবে, তারপর আমি আভিধানিক বিষয়বস্তু কপি হবে - blah.pyপ্যাকেজ মধ্যে __init__.pyপরিবর্তে এবং অপসারণ blah.py( উত্স ফাইলগুলির গুণন এখানে ভাল হয় না)।

আপনি যদি import *আইডিয়োমকে সমর্থন করতে জোর করেন (eek), তবে __all__(নাম হিসাবে একটি নাম হিসাবে আপনি নিজের মধ্যে রাখতে পারেন এটি ব্যবহার করে) ক্ষতি নিয়ন্ত্রণে সহায়তা করতে পারে। সাধারণভাবে, নেমস্পেস এবং সুস্পষ্ট আমদানি ভাল জিনিস এবং আমি দৃ suggest়ভাবে উভয় ধারণা বা উভয় ধারণাকে বাইপাস করার ভিত্তিতে কোনও পদ্ধতির পুনর্বিবেচনার পরামর্শ দিই! -)


9
ব্যক্তিগতভাবে, আমি জিনিসগুলি আলাদা রাখতে পছন্দ করি এবং তারপরে * আমদানি করি। কারণ হ'ল, ভাঁজ এবং স্টাফ সত্ত্বেও, আমি এখনও সম্পর্কিত হলেও এমনকি অনেকগুলি ক্লাসযুক্ত ফাইলগুলি ব্রাউজ করতে ঘৃণা করি।
স্টেফানো বোরিনি

5
@ স্টেফানো একটি বড় কাঠামো সম্পর্কে ভাবেন। যদি এটি ব্যবহার করে তবে import *আপনাকে অবশ্যই সমস্ত কাঠামো নিঃশর্তভাবে গ্রহণ করতে হবে, এমনকি এমন বৈশিষ্ট্য যা আপনি কখনও ব্যবহার করবেন না। __init__.pyখালি রাখা আপনাকে কেবল সমস্ত-বা-কিছুই সিমেটিকের চেয়ে বেশি সুযোগ দেয়। পাকানো সম্পর্কে চিন্তা
মিলিগ্রাম

যদি এটি খালি রাখে, এমনকি মোবাইলস্কুটার আমদানি করার পরেও, কেউ এখনও মোবাইলসকোটার.ম্যাপার বা মোবাইলস্কুটার.ভিহিকেল বা মোবাইলসকোটার.ও যেটি ব্যবহার করতে পারে না। মোবাইলসকোটার আমদানি করে না? মোবাইলসকোটার.বি ..... খুব ভার্জোজ?
সানকিয়াং

6
@ সানকিয়াং এটি ব্যক্তিগত তবে আমার মনে হয় না। from mobilescouter import A, Bকেবলমাত্র একটি কোডের লাইন এবং আপনার কোনও প্রকল্প নেই and one6 ক্লাস এবং প্রত্যেকের নিজস্ব ফাইল সহ, ডান? import *আপনার কোডে যদি দু'একটি বেশি থাকে তবে আপনি সম্ভাব্য আবর্জনা দিয়ে নাম স্থানটি পূরণ করছেন এবং দ্রুত আপনি কোথায় তা ভুলে যাবেনA কোথা থেকে আসবেন । এবং যদি একটি উচ্চ প্যাকেজ একই কাজ করে? আপনি সমস্ত উপ-প্যাকেজ এবং উপ-উপ-প্যাকেজগুলি দখল করছেন। পাইথনের জেন যেমন বলে, সুস্পষ্ট বর্ণিত চেয়ে উত্তম।
মিলিগ্রাম

1
@mg, যদি সেখানে একটি লাইন "আমদানি, A, B" হয় Init .py ফাইল, তারপর আমি এ (বা বি) সিনট্যাক্স সঙ্গে কল করতে পারেন: mobilescouter.A; যদি আমরা "মোবাইলস্কুটার আমদানি করে A, B" ব্যবহার করি, তবে এটি কেবল এ। এই লাইনটির একসময়, আমি মনে করি না যে এ মোবাইলস্কুটারের একটি সাব প্যাকেজ, এবং আমার মনে হয় এটি নামস্থান দূষণে অবদান রাখে (যদিও এটি মোবাইলস্কুটার আমদানি থেকে "" "তুলনায় অনেক ভাল" I আমি এখনও "ইম্পোর্ট পিকেগনেম" ব্যবহারকারীকে পছন্দ করি) অভিন্ন প্রকাশ্য ইন্টারফেস তাই। Init আমদানি sub_pkgname কিছু .py।
sunqiang

1

আপনার __init__.pyএকটি ডক্ট্রিং করা উচিত ।

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

অন্য যে কোনও সামগ্রীর জন্য, ফায়ারক্রো এবং অ্যালেক্স মার্টেলির দুর্দান্ত উত্তরগুলি দেখুন ।


প্রকৃত দেয় __init__.pyজন্য emailপ্যাকেজ এই গাইডলাইন অনুসরণ করে? আমি একটি একক লাইন ডাস্ট্রিং দেখছি যা "প্যাকেজের মধ্যে থাকা বিভিন্ন উপাদান কীভাবে একসাথে কাজ করে" ব্যাখ্যা করার জন্য বেশি কিছু করে না।
জার্টেলেক্স

@ জার্টলেক্স সম্ভবত ওয়েব ডকুমেন্টেশনেই থাকতে পারে।
অঙ্কুর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.