আমি কি বৈশ্বিক চলক সংজ্ঞায়িত করতে __init__.py ব্যবহার করতে পারি?


130

আমি একটি ধ্রুবক সংজ্ঞায়িত করতে চাই যা প্যাকেজের সমস্ত সাবমডিউলগুলিতে পাওয়া উচিত। আমি ভেবেছি যে __init__.pyরুট প্যাকেজটির ফাইলের মধ্যে সবচেয়ে ভাল জায়গা হবে । তবে আমি কীভাবে এটি করব তা জানি না। ধরুন আমার কাছে কয়েকটি উপ-প্যাকেজ এবং প্রতিটি বেশ কয়েকটি মডিউল রয়েছে। এই মডিউলগুলি থেকে আমি কীভাবে সেই পরিবর্তনশীলটি অ্যাক্সেস করতে পারি?

অবশ্যই, যদি এটি সম্পূর্ণরূপে ভুল হয় এবং এর থেকে আরও ভাল বিকল্প থাকে তবে আমি এটি জানতে চাই।

উত্তর:


196

আপনার এগুলি রাখতে সক্ষম হওয়া উচিত __init__.py। এটি সর্বদা করা হয়।

mypackage/__init__.py:

MY_CONSTANT = 42

mypackage/mymodule.py:

from mypackage import MY_CONSTANT
print "my constant is", MY_CONSTANT

তারপরে, মাইমডিউল আমদানি করুন:

>>> from mypackage import mymodule
my constant is 42

তবুও, যদি আপনার কাছে ধ্রুবক থাকে তবে এগুলি পৃথক মডিউল (কনস্ট্যান্ট.পি, কনফিগার। তাদের।

mypackage/__init__.py:

from mypackage.constants import *

তবুও, এটি প্যাকেজ মডিউলগুলির নেমস্পেসে স্বয়ংক্রিয়ভাবে ধ্রুবকগুলিকে অন্তর্ভুক্ত করে না। প্যাকেজটির প্রতিটি মডিউল এখনও ধ্রুবক থেকে আমদানি করতে হবে না হয় mypackageবা এগুলি থেকে mypackage.constants


19
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত ছিল। আপনি যদি পাইথন ২.৫ বা from . import MY_CONSTANT
ততোধিকের

দ্বিতীয় উপায়টি কেবল ধ্রুবকদের জন্য কাজ করে না? from mypackage.constants import *কপি স্থাপন করবে MY_CONSTANTবরং একই পরিবর্তনশীল একটি রেফারেন্স চেয়ে যে submodule মধ্যে
hardmooth

@ হার্ডমুথ: ঠিক নয়। মানগুলি রেফারেন্স দ্বারা অনুলিপি করা হয়, সুতরাং আপনি যদি MY_CONSTANTকোনও মডিউলটিতে রূপান্তর করতে চান তবে এটি সর্বত্র পরিবর্তিত হবে। আপনি যদি MY_CONSTANTকোনও মডিউলটিতে পুনরায় নিয়োগ করতে চান তবে এটি কেবল সেই মডিউলটিকেই প্রভাবিত করবে। যদি এটি আপনার অভিপ্রায় হয় তবে আপনাকে অবশ্যই গুণাবলীর দ্বারা রেফারেন্স করতে হবে mypackage.constants.MY_CONSTANT
জেসন

7
উদাহরণের সাথে একটি ক্যাপচার হ'ল আপনি যদি mymodule.pyএর __init__.pyআগে আমদানি করেন তবে MY_CONSTANT = 42ব্যর্থ হবেন কারণ যখন আমদানি mymodule.py MY_CONSTANTএখনও সংজ্ঞায়িত হয়নি। সুতরাং MY_CONSTANT = 42উপরের স্থানান্তরিত হওয়া দরকারimport mymodule
চিহ্নম্নল

পরিবর্তনশীল সম্পর্কে কেমন? এটি স্থির নয়, পরিবর্তনশীল সম্পর্কে জিজ্ঞাসা করছে। কীভাবে পাইথন প্যাকেজের অভ্যন্তরে পরিবর্তনশীল আচরণ করে? প্যাকেজের অভ্যন্তরে ভেরিয়েবল পরিবর্তন করা হয়েছে কি?
টমসওয়ায়ার

31

তুমি এটা করতে পার না. আপনাকে প্রতিটি স্বতন্ত্র মডিউলটির নামের জায়গায় স্পষ্টভাবে আপনার ধ্রুবকগুলি আমদানি করতে হবে। এটি অর্জনের সর্বোত্তম উপায় হ'ল "কনফিগার" মডিউলে আপনার ধ্রুবককে সংজ্ঞায়িত করা এবং আপনার যেদিকেই এটি প্রয়োজন সেখানে আমদানি করা:

# mypackage/config.py
MY_CONST = 17

# mypackage/main.py
from mypackage.config import *

হ্যাঁ, একটি কনফিগারেশন ফাইল হ'ল আমি চাই। আমি কেবল ভেবেছিলাম যে init .py ভাল জায়গা হবে। আপনার সমাধানটি স্ট্যান্ডার্ড অনুশীলনের মতো মনে হচ্ছে। তাই কি?
আন্দ্রেই বাজনা দ্বিতীয়

1
ভাল যুক্তি. আমি বুঝতে পারিনি যে প্রশ্নটি সমস্ত প্যাকেজ মডিউলগুলির নাম স্থানে স্বয়ংক্রিয়ভাবে স্থাপন করা ছিল।
জেসন আর। কুমবস

তবে প্রতিবার কোনও স্ক্রিপ্ট কনফিগার করে আমদানি করে, অভ্যন্তরীণ কোডটি কার্যকর করা হয়। কনফিগ.পি.-এর ভিতরে কোডটি একবারে চালানো হলে আপনি কী সুপারিশ করবেন? বলুন আমি কনফিগার.পি-র ভিতরে একটি সেটিংস.জসন ফাইলটি পড়ছি এবং আমি যখনই কনফিগার করেছিলাম তখনই আমি এটি খুলতে চাই না।
অগিওয়ান

@ ইউজিএস পাইথন কীভাবে কাজ করে তা নয়। প্রতিটি মডিউল কেবল একবারই কার্যকর করা হয়। যখন এটি দ্বিতীয়বার আমদানি করা হয়, মডিউলটি ইতিমধ্যে ক্যাশে করা হয় sys.modules
ফার্ডিনান্ড বায়ার

নিবন্ধন করুন আমি উল্লেখ করতে ভুলে গেছি যে আমি একই স্ক্রিপ্টটি নয় বরং বিভিন্ন স্ক্রিপ্ট থেকে কনফিগার.পি আমদানি করছি। বলুন a.py কনফিগারেশন & b.py আমদানি করছে এবং বি.পি.টি কনফিগার.পি আমদানি করছে। আমি ভাবছিলাম কনফিগার.পি-র ভিতরে কোডটি একবারে কার্যকর করা সম্ভব কিনা।
অগিওয়ান

2

আপনি যে কোনও জায়গা থেকে গ্লোবাল ভেরিয়েবলগুলি সংজ্ঞায়িত করতে পারেন তবে এটি সত্যিই খারাপ ধারণা। __builtin__মডিউলটি আমদানি করুন এবং এই মডিউলগুলিতে সংশোধন বা বৈশিষ্ট্য যুক্ত করুন এবং হঠাৎ আপনার নতুন বিল্টিন ধ্রুবক বা ফাংশন রয়েছে। আসলে, যখন আমার অ্যাপ্লিকেশনটি gettext ইনস্টল করে, আমি কোনও কিছু আমদানি না করে আমার সমস্ত মডিউলগুলিতে _ () ফাংশনটি পাই। সুতরাং এটি সম্ভব, তবে অবশ্যই কেবল অ্যাপ্লিকেশন-ধরণের প্রকল্পগুলির জন্য, পুনরায় ব্যবহারযোগ্য প্যাকেজ বা মডিউলগুলির জন্য নয়।

এবং আমি অনুমান করি যে কোনওভাবেই এই অনুশীলনের সুপারিশ করবে না। একটি নেমস্পেসে কী সমস্যা? বলল আবেদন, সংস্করণ মডিউল রয়েছে যাতে আমি "বিশ্বব্যাপী" মত প্রাপ্তিসাধ্য ভেরিয়েবল আছে version.VERSION, version.PACKAGE_NAMEইত্যাদি


0

কেবল যুক্ত করতে চেয়েছিলেন যে কনস্ট্যান্টরা একটি কনফিগার.ইআই ফাইল ব্যবহার করে নিযুক্ত করা যায় এবং কনফিগার পার্সোনারী লাইব্রেরি ব্যবহার করে স্ক্রিপ্টে পার্স করা যায়। আপনি একাধিক পরিস্থিতিতে স্থির থাকতে পারে। উদাহরণস্বরূপ, যদি আপনার কাছে দুটি পৃথক ইউআরএল অনুরোধের জন্য প্যারামিটার ধ্রুবক থাকে তবে কেবল তাদের মতো লেবেল করুন:

mymodule/config.ini
[request0]
conn = 'admin@localhost'
pass = 'admin'
...

[request1]
conn = 'barney@localhost'
pass = 'dinosaur'
...

পাইথন ওয়েবসাইটে ডকুমেন্টেশনটি খুব সহায়ক বলে মনে করেছি। পাইথন 2 এবং 3 এর মধ্যে কোনও পার্থক্য আছে কিনা তা আমি নিশ্চিত নই তাই এখানে উভয়ের লিঙ্ক রয়েছে:

পাইথন 3 এর জন্য: https://docs.python.org/3/library/configparser.html#module-configparser

পাইথন 2 এর জন্য: https://docs.python.org/2/library/configparser.html#module-configparser

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