আমদানি বিবৃতি পাইথন 3 এর পরিবর্তনসমূহ


177

আমি পিপ -0404 থেকে নিম্নলিখিতটি বুঝতে পারি না

পাইথন 3-এ, প্যাকেজগুলির মধ্যে অন্তর্নিহিত আপেক্ষিক আমদানি আর উপলভ্য নয় - কেবল পরম ইম্পোর্ট এবং সুস্পষ্ট আপেক্ষিক আমদানি সমর্থনযোগ্য। এছাড়াও, স্টার আমদানিগুলি (যেমন x আমদানি * থেকে) কেবলমাত্র মডিউল স্তরের কোডেই অনুমোদিত।

আপেক্ষিক আমদানি কী? পাইথন 2 এ অন্য কোন জায়গায় স্টার আমদানির অনুমতি ছিল? উদাহরণ সহ ব্যাখ্যা করুন।

উত্তর:


277

আপনি যখন বর্তমান স্ক্রিপ্ট / প্যাকেজের সাথে সম্পর্কিত কোনও প্যাকেজ আমদানি করছেন তখন আপেক্ষিক আমদানি ঘটে।

উদাহরণস্বরূপ নিম্নলিখিত গাছটি বিবেচনা করুন:

mypkg
├── base.py
└── derived.py

এখন, আপনার derived.pyকিছু প্রয়োজন base.py। পাইথন 2 এ আপনি এটি (ইন derived.py) এর মতো করে করতে পারেন :

from base import BaseThing

পাইথন 3 আর সমর্থন করে না যেহেতু এটি আপনি 'আত্মীয়' বা 'পরম' চান কিনা তা স্পষ্ট নয় base। অন্য কথায়, baseসিস্টেমে যদি পাইথন প্যাকেজ ইনস্টলড থাকে তবে আপনি ভুলটি পেয়ে যাবেন।

পরিবর্তে এটির জন্য আপনাকে স্পষ্টত আমদানি ব্যবহার করতে হবে যা স্পষ্টভাবে কোনও পথের মতো ভিত্তিতে মডিউলটির অবস্থান নির্দিষ্ট করে। আপনার derived.pyমত দেখতে হবে:

from .base import BaseThing

নেতৃস্থানীয় .বলেছেন ' baseমডিউল ডিরেক্টরি থেকে আমদানি '; অন্য কথায়, .baseমানচিত্র ./base.py

একইভাবে, এখানে ..উপসর্গ রয়েছে যা ডিরেক্টরি শ্রেণিবদ্ধের উপরে চলে আসে ../( ..modম্যাপিং সহ ../mod.py), এবং তারপরে ...যা দুটি স্তরে ( ../../mod.py) এবং আরও কিছু যায়।

তবে দয়া করে নোট করুন যে উপরে উল্লিখিত আপেক্ষিক পাথগুলি সেই ডিরেক্টরিতে আপেক্ষিক যেখানে বর্তমান মডিউল ( derived.py) বর্তমান কার্যনির্বাহী ডিরেক্টরি নয় not


@ ব্রেনবার্ন ইতিমধ্যে তারকা আমদানির বিষয়টি ব্যাখ্যা করেছে। সম্পূর্ণতার জন্য, আমি একই বলতে হবে;)।

উদাহরণস্বরূপ, আপনাকে কয়েকটি mathফাংশন ব্যবহার করতে হবে তবে আপনি সেগুলি কেবল একটি ফাংশনেই ব্যবহার করেন। পাইথন 2 এ আপনাকে আধা-অলস হওয়ার অনুমতি দেওয়া হয়েছিল:

def sin_degrees(x):
    from math import *
    return sin(degrees(x))

দ্রষ্টব্য যে এটি ইতিমধ্যে পাইথন 2 এ একটি সতর্কতা ট্রিগার করে:

a.py:1: SyntaxWarning: import * only allowed at module level
  def sin_degrees(x):

আধুনিক পাইথন 2 কোডে আপনার হওয়া উচিত এবং পাইথন 3 এ আপনাকে যা করতে হবে:

def sin_degrees(x):
    from math import sin, degrees
    return sin(degrees(x))

বা:

from math import *

def sin_degrees(x):
    return sin(degrees(x))

14

আপেক্ষিক আমদানির জন্য ডকুমেন্টেশন দেখুন । আপেক্ষিক আমদানি হ'ল আপনি যখন কোনও মডিউল থেকে সেই মডিউলটির অবস্থানের তুলনায় একেবারে পরিবর্তে আমদানি করেন sys.path

হিসাবে import *ফাংশন মধ্যে পাইথন 2 অনুমতি তারকা আমদানি, উদাহরণস্বরূপ:

>>> def f():
...     from math import *
...     print sqrt

পাইথন 2 এ এর ​​জন্য একটি সতর্কতা জারি করা হয়েছে (কমপক্ষে সাম্প্রতিক সংস্করণগুলি)। পাইথন 3 এ এটি আর অনুমোদিত নয় এবং আপনি কেবলমাত্র একটি মডিউল (ফাংশন বা শ্রেণীর অভ্যন্তরে নয়) শীর্ষ স্তরে তারকা আমদানি করতে পারেন।


6
কেন এই সিদ্ধান্ত নেওয়া হয়েছিল?
ডোর

1
আমার অনুমান যে এর পেছনের ধারণাটি হ'ল 'স্পষ্ট বর্ণিত চেয়ে ভাল' ' পিইপি 20 থেকে - পাইথনের জেন। মডিউলটির আগে বিন্দুটি আপেক্ষিক / ননর্লেটিভ লিঙ্কিংকে স্পষ্ট করে তোলে সম্ভাব্য নাম সংঘর্ষের সমাধান করে। যদিও 'পঠনযোগ্যতা গণনা করা হয়।' সামান্য ভোগা।
পাফনুচি

2
না, প্রকৃতপক্ষে এটি ছিল "বিপরীত", "ব্যবহারিকতার বিশুদ্ধতা বীট" সিদ্ধান্ত। ফাংশনের অভ্যন্তরে স্থানীয় পরিবর্তনশীল অ্যাক্সেসের অনুকূলকরণের জন্য এটি প্রয়োজনীয় ছিল, যেহেতু "আমদানি *" না করে সংকলক সর্বদা কেবল কোড বিশ্লেষণ করেই জানেন যে কোন ভেরিয়েবল স্থানীয় এবং সরাসরি দেখা যায়। প্রকৃতপক্ষে, ফাংশনগুলি স্থানীয় সঞ্চয়স্থানের জন্য ডিক ব্যবহার করে না, তবে একটি অনুকূলিত অ্যারে যেখানে ভেরিয়েবলগুলি অনন্য সূচকগুলি পায়।
ভেকি

11

পাইথন 2 এবং পাইথন 3 উভয়কে সমর্থন করতে, নীচের মতো সুস্পষ্ট আপেক্ষিক আমদানি ব্যবহার করুন। তারা বর্তমান মডিউলের তুলনায়। এগুলি 2.5 থেকে শুরু করে সমর্থন করা হয়েছে ।

from .sister import foo
from . import brother
from ..aunt import bar
from .. import uncle

14
আমদানি করুন। অন্য আমাকে পাইথন 3.5 তে একটি অবৈধ সিনট্যাক্স ত্রুটি দেয়। এইটা সাধারণ? আমি আছে init ডিরেক্টরি এটা হয় .py
Frikster

1
import .brotherঅজগর 2 এবং 3 উভয়েরই জন্য অবৈধ বাক্য গঠন
রদ্রিগো ই প্রিন্সিপ

@ রডরিগো ই প্রিন্সিপিকে এবং তাই বলে মনে হচ্ছে import ..uncle। সংশোধন করা হয়েছে। ওহ, আমি কী ভাবছিলাম ... সম্ভবত এমন নাইটদের দ্বারা বিভ্রান্ত হয়ে পড়ে যারা নী বলে!
আকসেলি পালান

4

মাইচ গার্নির উত্তরে আর একটি মামলা যুক্ত হয়েছে:

নোট করুন যে আপেক্ষিক আমদানি বর্তমান মডিউলটির নামের উপর ভিত্তি করে। যেহেতু মূল মডিউলটির নাম সর্বদা " __main__" থাকে, তাই পাইথন অ্যাপ্লিকেশনটির মূল মডিউল হিসাবে ব্যবহৃত মডিউলগুলি সর্বদা পরম আমদানি ব্যবহার করে use

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