পাইথনে আপেক্ষিক আমদানিতে কী সমস্যা?


89

আমি সম্প্রতি আপগ্রেড সংস্করণ pylint , একটি জনপ্রিয় পাইথন শৈলী-পরীক্ষা।

সম্পূর্ণ প্যাকেজ পাথটি নির্দিষ্ট না করে একই প্যাকেজে যেখানে মডিউলগুলি আমদানি করে সেই জায়গাগুলিকে নির্দেশ করে এটি আমার কোডজুড়ে ব্যালিস্টিক হয়ে উঠেছে।

নতুন ত্রুটি বার্তাটি W0403।

W0403:% r তুলনামূলকভাবে আমদানি করা উচিত r

প্যাকেজ ডিরেক্টরি সম্পর্কিত কোনও আমদানি সনাক্ত করা হলে ব্যবহৃত হয়।


উদাহরণ

উদাহরণস্বরূপ, যদি আমার প্যাকেজগুলি এই জাতীয় কাঠামোগত হয়:

/cake
  /__init__.py
  /icing.py
  /sponge.py
/drink

এবং স্পঞ্জ প্যাকেজে আমি লিখি:

import icing

পরিবর্তে

import cake.icing

আমি এই ত্রুটি পেতে হবে।


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

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

উত্তর:


97

সমস্যাটি import icingহ'ল এটি আপনি নিরঙ্কুশ আমদানি বা আপেক্ষিক আমদানি কিনা তা জানেন না।icingপাইথনের পথে কোনও মডিউল বা বর্তমান মডিউলে কোনও প্যাকেজ পারে। স্থানীয় প্যাকেজটির পাইথন স্ট্যান্ডার্ড লাইব্রেরি প্যাকেজের একই নাম থাকলে এটি বেশ বিরক্তিকর।

আপনি from __future__ import absolute_importএমনটি করতে পারেন যা পুরোপুরি অন্তর্নিহিত আপেক্ষিক আমদানি বন্ধ করে দেয়। অস্পষ্টতা সম্পর্কে এই ন্যায়সঙ্গত সহ, পিইপি 328-তে এটি বর্ণনা করা হয়েছে । আমি বিশ্বাস করি পাইথন 3000 এর অন্তর্নিহিত আপেক্ষিক আমদানি সম্পূর্ণভাবে বন্ধ হয়ে গেছে।

আপনি এখনও আপেক্ষিক আমদানি করতে পারেন, তবে আপনাকে এগুলি স্পষ্টভাবে করতে হবে:

from . import icing

2
+1 বিশেষত সমঝোতার সমাধানের জন্য, যা সম্ভবত আমার যাওয়া উচিত।
অগ্নিচিন্তা

2
নোট আপনি import .icingপরিবর্তে করতে পারেনfrom . import icing
জ্যাক

11
@ জ্যাক আসলে আমার মনে হয় না আপনি পারবেন। পিইপি 328 এর এই অংশ থেকে : আপেক্ষিক আমদানি সর্বদা ব্যবহার করতে হবে from <> import; import <>সর্বদা পরম। অবশ্যই, নিখুঁত আমদানি from <> importনেতৃস্থানীয় বিন্দু বাদ দিয়ে ব্যবহার করতে পারে । কারণ import .fooকারণ পর নিষিদ্ধ করা হয় import XXX.YYY.ZZZতারপর XXX.YYY.ZZZএকটি অভিব্যক্তি উপভোগ্য হয়। তবে .moduleYএকটি অভিব্যক্তিতে ব্যবহারযোগ্য নয়।
এ.ওয়ান

48

কয়েকটি ভাল কারণ আছে:

  1. আপনি যখন কোনও মডিউল ঘুরে দেখেন তখন সম্পর্কিত আমদানিগুলি সহজেই ভেঙে যায়।

    আপনার প্যাকেজে আপনার একটি foo.bar, একটি foo.bazএবং একটি bazমডিউল রয়েছে তা কল্পনা করুন । foo.barআমদানি foo.baz, কিন্তু একটি আপেক্ষিক আমদানি ব্যবহার করে।

    এখন, আপনি যদি স্থানান্তরিত foo.barহন bar, আপনার মডিউল হঠাৎ করেই অন্যরকম আমদানি করছে baz!

  2. আপেক্ষিক আমদানিগুলি অস্পষ্ট। এমনকি barউপরের উদাহরণে মডিউলটি ঘুরে না ফেলেও, আপনার প্রকল্পে আগত একজন নতুন বিকাশকারীকে রুট-স্তরের প্যাকেজের পরিবর্তে bazএটি সত্যিকার অর্থে না বুঝতে পেরে ক্ষমা করা যেতে পারে ।foo.bazbaz

    নিখুঁত আমদানিগুলি কী মডিউলটি ব্যবহৃত হচ্ছে তা স্পষ্ট করে তোলে। এবং import thisপ্রচার হিসাবে , সুস্পষ্ট ইঙ্গিত চেয়ে ভাল।

  3. পাইথন 3 পুরোপুরি অন্তর্ভুক্ত আপেক্ষিক আমদানি অক্ষম করেছে; আমদানি এখন সর্বদা নিরঙ্কুশ হিসাবে ব্যাখ্যা করা হয় যার অর্থ যে উপরের উদাহরণে import bazসর্বদা শীর্ষ স্তরের মডিউল আমদানি করা হবে। পরিবর্তে আপনাকে স্পষ্টত আমদানি বাক্য গঠন ( from . import baz) ব্যবহার করতে হবে ।

    পাইথন 2 থেকে 3 এর উদাহরণটি বানাতে এইভাবে অপ্রত্যাশিত সমস্যার সৃষ্টি হতে পারে, এখন নিখুঁত আমদানি ব্যবহার করা আপনার কোডটিকে ভবিষ্যত-প্রমাণ করে তুলবে।


10
# 2 এবং # 3 এর জন্য +1। তবে পুরো ডিরেক্টরিটি সরানো হলে (1 স্তরকে নীচে নামানো) কী ঘটবে তার বিরুদ্ধে # 1 অবশ্যই অফসেট হতে হবে।
অগ্নিচিন্তা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.