ইতিমধ্যে ফ্ল্যাট প্যাকেজ ব্যবহার করার পরে, আমি নেস্টেড প্যাকেজগুলির সাথে আমার যে সমস্যার মুখোমুখি হয়েছিল তা আশা করছিলাম না। এখানে…
ডিরেক্টরি বিন্যাস
dir
|
+-- test.py
|
+-- package
|
+-- __init__.py
|
+-- subpackage
|
+-- __init__.py
|
+-- module.py
Init .py এর সামগ্রী
উভয় package/__init__.py
এবং package/subpackage/__init__.py
খালি।
কন্টেন্ট module.py
# file `package/subpackage/module.py`
attribute1 = "value 1"
attribute2 = "value 2"
attribute3 = "value 3"
# and as many more as you want...
test.py
(3 সংস্করণ) এর সামগ্রী
সংস্করণ 1
# file test.py
from package.subpackage.module import *
print attribute1 # OK
জিনিসগুলি আমদানির জন্য এটি খারাপ এবং অনিরাপদ উপায় (সমস্ত কিছু প্রচুর পরিমাণে আমদানি করা) তবে এটি কার্যকর হয়।
সংস্করণ 2
# file test.py
import package.subpackage.module
from package.subpackage import module # Alternative
from module import attribute1
আইটেম অনুসারে আইটেমটি আমদানির একটি নিরাপদ উপায়, তবে এটি ব্যর্থ হয়, পাইথন এটি চায় না: বার্তাটি দিয়ে ব্যর্থ হয়: "মডিউল নামে কোনও মডিউল নেই"। যাহোক …
# file test.py
import package.subpackage.module
from package.subpackage import module # Alternative
print module # Surprise here
… বলে <module 'package.subpackage.module' from '...'>
। সুতরাং এটি একটি মডিউল, তবে এটি কোনও মডিউল / -P 8-O নয় u
সংস্করণ 3
# file test.py v3
from package.subpackage.module import attribute1
print attribute1 # OK
এই এক কাজ করে। সুতরাং আপনি হয় পুরোপুরি ওভারকিল উপসর্গটি ব্যবহার করতে বাধ্য হন বা # 1 সংস্করণ হিসাবে অনিরাপদ উপায়টি ব্যবহার করতে এবং পাইথন দ্বারা নিরাপদ উপায়ে ব্যবহার করতে নিষেধ করেছেন? সবচেয়ে ভাল উপায়, যা নিরাপদ এবং আনুষঙ্গিক দীর্ঘ উপসর্গ এড়ানোর একমাত্র পাইথন প্রত্যাখ্যান করে? এটি কি কারণ এটি ভালবাসে import *
বা এটি অত্যধিক উপসর্গ (যা এই অনুশীলনটি প্রয়োগ করতে সহায়তা করে না) পছন্দ করে?
শক্ত কথার জন্য দুঃখিত, তবে এই দু'দিন ধরে আমি এই নির্বোধের মতো আচরণ করার চেষ্টা করছি ‑ আমি অন্য কোথাও ভুল না হলে পাইথনের মডেল প্যাকেজ এবং সাব-প্যাকেজগুলির মধ্যে কিছুটা সত্যিই ভেঙে গেছে এমন অনুভূতিটি আমাকে ছেড়ে দেবে।
মন্তব্য
- আমি
sys.path
বিশ্বব্যাপী পার্শ্ব প্রতিক্রিয়া এড়াতে বা*.pth
ফাইলগুলিতে নির্ভর করতে চাই না , যাsys.path
একই বৈশ্বিক প্রভাবগুলির সাথে খেলতে পারা অন্য উপায় । সমাধানটি পরিষ্কার হওয়ার জন্য, এটি কেবল স্থানীয় হতে হবে। হয় পাইথন উপ-প্যাকেজ পরিচালনা করতে সক্ষম হয়, হয় তা নয়, তবে স্থানীয় স্টাফগুলি পরিচালনা করতে এটির জন্য বিশ্বব্যাপী কনফিগারেশন নিয়ে খেলতে হবে না। - আমি আমদানিগুলিও ব্যবহার করার চেষ্টা করেছি
package/subpackage/__init__.py
, তবে এটি কিছুই সমাধান করেনি, এটি একই কাজ করে এবং অভিযোগগুলিsubpackage
একটি পরিচিত মডিউল নয়, যখনprint subpackage
বলে যে এটি একটি মডিউল (আবার অদ্ভুত আচরণ,)।
হতে পারে আমি পুরোপুরি ভুল শক্ত (বিকল্পটি আমি পছন্দ করব), তবে এটি পাইথন সম্পর্কে অনেক হতাশ বোধ করি।
তিনজনের পাশে আর কোন পরিচিত উপায় আমি চেষ্টা করেছি? এমন কিছু যা আমি জানি না?
(দীর্ঘশ্বাস)
-----% <----- সম্পাদনা ----->% -----
এখন পর্যন্ত উপসংহার (জনগণের মন্তব্যের পরে)
পাইথনে রিয়েল সাব-প্যাকেজের মতো কিছুই নেই, কারণ সমস্ত প্যাকেজ রেফারেন্স বিশ্বব্যাপী ডিকশনারিতে যায়, কেবল যার অর্থ কোনও স্থানীয় অভিধান নেই, যা বোঝায় যে স্থানীয় প্যাকেজ রেফারেন্স পরিচালনা করার কোনও উপায় নেই।
আপনাকে হয় পুরো উপসর্গ বা সংক্ষিপ্ত উপসর্গ বা উপনাম ব্যবহার করতে হবে। হিসাবে:
সম্পূর্ণ উপসর্গ সংস্করণ
from package.subpackage.module import attribute1
# An repeat it again an again
# But after that, you can simply:
use_of (attribute1)
সংক্ষিপ্ত উপসর্গ সংস্করণ (তবে পুনরাবৃত্তি উপসর্গ)
from package.subpackage import module
# Short but then you have to do:
use_of (module.attribute1)
# and repeat the prefix at every use place
বা অন্যথায়, উপরের একটি প্রকরণ।
from package.subpackage import module as m
use_of (m.attribute1)
# `m` is a shorter prefix, but you could as well
# define a more meaningful name after the context
কারখানা সংস্করণ
আপনি যদি কোনও ব্যাচে একবারে একাধিক সত্তা আমদানি করতে আপত্তি করেন না তবে আপনি এটি করতে পারেন:
from package.subpackage.module import attribute1, attribute2
# and etc.
আমার প্রথম পছন্দসই স্বাদে নয় (আমি আমদানি করা সত্তার প্রতি এক আমদানির বিবৃতি দিতে পছন্দ করি), তবে ব্যক্তিগতভাবে আমি এটির পক্ষে পছন্দ করব।
আপডেট (2012-09-14):
লেআউট সম্পর্কে একটি মন্তব্য বাদে অবশেষে অনুশীলনে ঠিক আছে বলে মনে হয়। উপরের পরিবর্তে, আমি ব্যবহার করেছি:
from package.subpackage.module import (
attribute1,
attribute2,
attribute3,
...) # and etc.