'আমদানি মডিউল' বা 'মডিউল আমদানি থেকে' ব্যবহার করবেন?


410

আমি তা ব্যবহার করা সবচেয়ে ভাল উপর একটি ব্যাপক নির্দেশিকা এটি চেষ্টা করেছি import moduleবা from module import? আমি কেবল পাইথন দিয়ে শুরু করেছি এবং আমি সেরা অনুশীলনগুলি মাথায় রেখে শুরু করার চেষ্টা করছি।

মূলত, আমি আশা করছিলাম কেউ যদি তাদের অভিজ্ঞতা শেয়ার করতে পারে, কি পছন্দগুলি অন্যান্য বিকাশকারীদের আছে এবং কি ভাল উপায় কোন এড়াতে এর gotchas রাস্তায়?


5
আমি কেবল আপনাকে জানাতে চেয়েছিলাম, নির্বাচিত উত্তরটি ভুল। এতে বলা হয়েছে যে পার্থক্যটি বিষয়গত এবং সেখানে পার্থক্য রয়েছে। এটি সম্ভবত ত্রুটিগুলি সনাক্ত করা শক্ত হতে পারে। মাইকেল রে লাভটসের উত্তর দেখুন।
মায়ু 36


2
'from module import X,Y,Zবনাম নির্দিষ্ট নাম সনাক্তকারী আমদানি করার মধ্যে পার্থক্য রয়েছে'from module import * । পরেরটি আপনার নাম স্থানটিকে দূষিত করে এবং মডিউলে কী চলছে তার উপর নির্ভর করে অনাকাঙ্ক্ষিত ফলাফল দিতে পারে। আরও খারাপ এখনও from module import *একাধিক মডিউল নিয়ে কাজ করছে ।
স্মি

উত্তর:


474

import moduleএবং এর মধ্যে পার্থক্যটি from module import fooমূলত সাবজেক্টিভ। আপনি যা পছন্দ করেন তা চয়ন করুন এবং এটির ব্যবহারে আপনি সামঞ্জস্য বজায় রাখুন। আপনাকে সিদ্ধান্ত নিতে সহায়তা করার জন্য এখানে কিছু বিষয় রয়েছে।

import module

  • পেশাদাররা:
    • আপনার importবক্তব্য কম রক্ষণাবেক্ষণ । মডিউল থেকে অন্য আইটেমটি ব্যবহার শুরু করার জন্য কোনও অতিরিক্ত আমদানি যুক্ত করার দরকার নেই
  • কনস:
    • module.fooআপনার কোডে টাইপিং ক্লান্তিকর এবং অতিরিক্ত কাজ হতে পারে ( import module as moটাইপ ব্যবহার করে টেডিয়াম হ্রাস করা যেতে পারে mo.foo)

from module import foo

  • পেশাদাররা:
    • ব্যবহারের জন্য কম টাইপিং foo
    • কোন মডিউলের আইটেমগুলি অ্যাক্সেস করা যায় তার উপর আরও নিয়ন্ত্রণ
  • কনস:
    • মডিউল থেকে একটি নতুন আইটেম ব্যবহার করতে আপনাকে আপনার importবিবৃতি আপডেট করতে হবে
    • আপনি সম্পর্কে প্রসঙ্গ হারাবেন foo। উদাহরণস্বরূপ, এটি ceil()তুলনা করে কী কম তা পরিষ্কারmath.ceil()

উভয়ই পদ্ধতি গ্রহণযোগ্য, তবে ব্যবহার করবেন নাfrom module import *

কোনও যুক্তিসঙ্গত বৃহত কোডের জন্য, যদি আপনি import *সম্ভবত এটি মডিউলটিতে সিমেন্টিং করছেন তবে অপসারণ করা যায় না। এটি কারণ কোডটিতে ব্যবহৃত কোন আইটেমগুলি 'মডিউল' থেকে আসছে তা নির্ধারণ করা কঠিন, আপনি যে বিন্দুতে আর ব্যবহার করেন না importএমন জায়গায় পৌঁছনাকে সহজ করে তোলে তবে এটি নিশ্চিত হওয়া অত্যন্ত কঠিন।


66
"মডিউল আমদানি থেকে" * ব্যবহারকে নিরুৎসাহিত করার জন্য +1, এটি কেবল নেমস্পেসকে বিশৃঙ্খলা করে।
ক্রিশ্চিয়ান উইটস

22
নেমস্পেসকে গোলমাল করা "আমদানি *" এর সবচেয়ে সমস্যাযুক্ত অংশ নয় , এটি পঠনযোগ্যতা হ্রাস: যে কোনও নাম দ্বন্দ্ব (ইউনিট) পরীক্ষায় নিজেকে দেখিয়ে দেবে। তবে আমদানি করা মডিউল থেকে আপনি যে সমস্ত নাম ব্যবহার করেন সেগুলি খালি হবে, একটি ইঙ্গিতের সাথে নারিটি এসেছে। আমি একেবারে "আমদানি *" ঘৃণা করি।
জর্জেন এ। এয়ারহার্ড

21
পাইথনের জেনটি কী স্পষ্ট করে বোঝায় নিখুঁত চেয়ে ভাল?
অ্যান্টনি কোচ

8
from module import *বিশেষ করে উপযোগী হতে পারে যদি এটি হিসেবে ব্যবহার: if(windows):\n\t from module_win import * \n else: \n\t from module_lin import *। তারপরে আপনার প্যারেন্ট মডিউলটিতে ওএস স্বতন্ত্র ফাংশনের নামগুলি থাকতে পারে, যদি মডিউল_লিন এবং মডিউল_উইনের ফাংশনটির নাম একই থাকে। এটি শর্তাধীন যে কোনও শ্রেণির উত্তরাধিকারসূত্রে।
আনিসনে

19
@anishsane। এটি করার আরও একটি উপায় আছে। মডিউল_উইনকে কিছু হিসাবে আমদানি করুন। তারপরে সর্বদা কিছু ব্যবহার
বিনয়

163

এখানে আরও একটি বিশদ রয়েছে, মডিউলটিতে লেখার সাথে সম্পর্কিত নয় mentioned অনুমোদিত যে এটি খুব সাধারণ নাও হতে পারে তবে সময়ে সময়ে আমার এটি প্রয়োজন needed

পাইথনে যেভাবে রেফারেন্স এবং নাম বাইন্ডিং কাজ করে, সেই কারণে আপনি যদি কোনও মডিউলে কিছু প্রতীক আপডেট করতে চান, foo.bar বলুন, সেই মডিউলটির বাইরে থেকে, এবং অন্যান্য আমদানি কোডটি সেই পরিবর্তনটি "দেখুন" করতে হবে, আপনাকে foo a আমদানি করতে হবে নির্দিষ্ট উপায়. উদাহরণ স্বরূপ:

মডিউল foo:

bar = "apples"

মডিউল একটি:

import foo
foo.bar = "oranges"   # update bar inside foo module object

মডিউল বি:

import foo           
print foo.bar        # if executed after a's "foo.bar" assignment, will print "oranges"

তবে, আপনি যদি মডিউল নামের পরিবর্তে প্রতীক নামগুলি আমদানি করেন তবে এটি কার্যকর হবে না।

উদাহরণস্বরূপ, আমি যদি মডিউলে এটি করি তবে:

from foo import bar
bar = "oranges"

এর বাইরের কোনও কোড বারকে "কমলা" হিসাবে দেখবে না কারণ আমার বারের সেটিংসটি মডিউলটির ভিতরে "বার" নামটি কেবল প্রভাবিত করে, এটি ফু মডিউল অবজেক্টটিতে "পৌঁছায়" এবং এর "বার" আপডেট করে না।


এই শেষ উদাহরণটির সাথে, আপনি কি এখনও 'ফু' ভিতরে 'বার' আপডেট করতে 'foo.bar = "কমলা" "কল করতে পারেন?
ভেলোসিরাবিট

4
না, শেষ উদাহরণে, 'ফু' নামটি অজানা
ঝিসালাইন লেভেক

31
এই উত্তরটি প্রশ্নের "সত্য" উত্তর সরবরাহ করে: দুটি আমদানি বৈকল্পিকের মধ্যে পার্থক্য কী
মায়ু 36

3
এই উত্তরটি একেবারে সঠিক প্রমাণ করার জন্য কিছু স্নিপেট লিখেছিলেন, তবে এর পিছনে যুক্তি কী?
huangbeidu

আমি মনে করি আপনি যা বলছেন তা হ'ল স্থানীয় ভেরিয়েবলের প্রতীক নামগুলি তবে গ্লোবাল ভেরিয়েবলগুলি রাখতে মডিউলের নাম আমদানি ???
WinEunuuchs2Unix

79

যদিও বহু লোক ইতিমধ্যে importবনাম সম্পর্কে ব্যাখ্যা করেছে import from, আমি হুডের নীচে কী ঘটে এবং যেখানে এটি পরিবর্তিত সমস্ত জায়গাগুলি রয়েছে সে সম্পর্কে কিছুটা আরও ব্যাখ্যা করার চেষ্টা করতে চাই।


import foo:

আমদানি fooকরে এবং বর্তমান নেমস্পেসে সেই মডিউলটির একটি রেফারেন্স তৈরি করে। তারপরে আপনাকে মডিউলটির ভিতরে থেকে কোনও নির্দিষ্ট বৈশিষ্ট্য বা পদ্ধতি অ্যাক্সেস করতে সম্পূর্ণ মডিউল পথটি নির্ধারণ করতে হবে।

উদাহরণস্বরূপ foo.barকিন্তু নাbar

from foo import bar:

fooতালিকাভুক্ত সমস্ত সদস্যের জন্য আমদানি করে এবং রেফারেন্স তৈরি করে ( bar)। ভেরিয়েবল সেট করে না foo

যেমন barকিন্তু bazবাfoo.baz

from foo import *:

আমদানি fooকরে এবং বর্তমান নামস্থানে সেই মডিউল দ্বারা সংজ্ঞায়িত সমস্ত পাবলিক অবজেক্টের রেফারেন্স তৈরি করে ( উপস্থিত __all__থাকলে তালিকাভুক্ত সমস্ত কিছু __all__, অন্যথায় যা শুরু হয় না _)। ভেরিয়েবল সেট করে না foo

যেমন barএবং bazনা _quxবা foo._qux


এখন দেখা যাক আমরা কখন করব import X.Y:

>>> import sys
>>> import os.path

পরীক্ষা করে দেখুন sys.modulesনামের সঙ্গে osএবং os.path:

>>> sys.modules['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> sys.modules['os.path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>

চেক করুন globals()এবং locals()নেমস্পেসের সাথে dicts osএবং os.path:

 >>> globals()['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> locals()['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> globals()['os.path']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'os.path'
>>>

উপরের উদাহরণ থেকে আমরা দেখতে পেলাম যে কেবল osস্থানীয় এবং বিশ্বব্যাপী নেমস্পেসে sertedোকানো হয়েছে। সুতরাং, আমাদের ব্যবহার করতে সক্ষম হওয়া উচিত:

 >>> os
 <module 'os' from
  '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
 >>> os.path
 <module 'posixpath' from
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
 >>>

কিন্তু না path

>>> path
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>

একবার আপনি osস্থানীয়দের () নেমস্পেস থেকে মুছে ফেললে , আপনি সিস্টেমে উপস্থিত থাকলেও osপাশাপাশি অ্যাক্সেস করতে সক্ষম হবেন না os.path: মডিউলগুলি:

>>> del locals()['os']
>>> os
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined
>>> os.path
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined
>>>

এখন এর সম্পর্কে কথা বলা যাক import from:

from:

>>> import sys
>>> from os import path

এবং sys.modulesসাথে পরীক্ষা করুন :osos.path

>>> sys.modules['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> sys.modules['os.path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>

আমরা এটি দেখতে পেয়েছি যে sys.modulesব্যবহার করে আমরা আগের মতো করেছিলামimport name

ঠিক আছে, আসুন দেখে নেওয়া যাক কীভাবে এটি দেখতে locals()এবং globals()নেমস্পেসের ডিক্টস:

>>> globals()['path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> locals()['path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> globals()['os']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'os'
>>>

নাম ব্যবহার করে আপনি অ্যাক্সেস করতে পারবেন pathনা os.path:

>>> path
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> os.path
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined
>>>

এর থেকে 'পথ' মুছুন locals():

>>> del locals()['path']
>>> path
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>

একটি উপনাম ব্যবহার করে একটি চূড়ান্ত উদাহরণ:

>>> from os import path as HELL_BOY
>>> locals()['HELL_BOY']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> globals()['HELL_BOY']
<module 'posixpath' from /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>>

এবং কোনও পথ নির্ধারণ করা হয়নি:

>>> globals()['path']
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
KeyError: 'path'
>>>

8
যদিও এটি ভার্বোস, এটি মোটামুটি জটিল প্রশ্নের তালিকার সত্যিই সেরা উত্তর। এই নির্দিষ্ট ইস্যুটির জন্য "হুডের নীচে" সূক্ষ্মতাগুলি ব্যাখ্যা করতে সহায়তা করার জন্য এটি প্রকৃত কোড সরবরাহ করে, যা এই নির্দিষ্ট ইস্যুর জন্য শৈলীর চেয়ে গুরুত্বপূর্ণ। আমি যদি এটি একাধিকবার upvote করতে পারি!
মাইক উইলিয়ামসন

as SYMBOLপরিবর্তনটি ব্যবহার করে কীভাবে এই উত্তরটি আদৌ কার্যকর হয়?
ম্যাক্সিমিলিয়ান বার্সলে

40

উভয় উপায়ই একটি কারণের জন্য সমর্থিত: এমন সময় রয়েছে যখন একের চেয়ে অপরটির চেয়ে বেশি উপযুক্ত।

  • import module: আপনি মডিউল থেকে অনেক বিট ব্যবহার করা হয় যখন দুর্দান্ত। অপূর্ণতা হ'ল আপনাকে মডিউল নামের প্রতিটি রেফারেন্স যোগ্য করতে হবে।

  • from module import ...: দুর্দান্ত যে আমদানি করা আইটেমগুলি মডিউল নামের উপসর্গ ছাড়াই সরাসরি ব্যবহারযোগ্য। অপূর্ণতা হ'ল আপনি যে প্রতিটি জিনিস ব্যবহার করেন তা অবশ্যই তালিকাভুক্ত করতে হবে এবং কোথা থেকে কোথা থেকে এসেছে তা কোডে এটি পরিষ্কার নয়।

কোনটি ব্যবহার করা উচিত তার উপর নির্ভর করে যা কোডটি পরিষ্কার এবং পঠনযোগ্য করে তোলে এবং ব্যক্তিগত পছন্দের সাথে সামান্য কিছু করার রয়েছে। আমি import moduleসাধারণত দিকে ঝুঁকে থাকি কারণ কোডটিতে এটি খুব স্পষ্ট যে কোনও বস্তু বা ক্রিয়াটি এসেছে। আমি ব্যবহার from module import ...যখন আমি কিছু বস্তু ব্যবহার করছি / একটি ফাংশন অনেক কোডে।


1
কি কোনও উপায় আছে from M import Xএবং এখনও কোনওভাবে বাছাইপর্ব ব্যবহারের সুবিধা পাবে? দেখে মনে হচ্ছে আপনি যদি M.Xএই আমদানির পরেও করতে পারেন তবে আপনি উভয় বিশ্বের সেরা অর্জন করতে পারেন ।
আর্থোপড

@ আর্টগ্রোপড: কিন্ডা। আপনি করতে পারেন class m: from something.too.long import x, y, z। যদিও সত্যিই এটি সুপারিশ করবে না।
মিথ্যা রায়ান

35

আমি ব্যক্তিগতভাবে সর্বদা ব্যবহার করি

from package.subpackage.subsubpackage import module

এবং তারপরে সমস্ত কিছু অ্যাক্সেস করুন

module.function
module.modulevar

ইত্যাদি কারণ হ'ল একই সময়ে আপনার সংক্ষিপ্ত আহ্বান রয়েছে এবং আপনি প্রতিটি রুটিনের মডিউল নামস্থান স্পষ্টভাবে সংজ্ঞায়িত করেন, এমন কিছু যা আপনার উত্সের কোনও প্রদত্ত মডিউল ব্যবহারের জন্য অনুসন্ধান করতে হলে খুব কার্যকর।

বলা বাহুল্য, আমদানি * ব্যবহার করবেন না, কারণ এটি আপনার নাম স্থানটিকে দূষিত করে এবং প্রদত্ত ফাংশনটি কোথা থেকে আসে তা আপনাকে জানায় না (কোন মডিউল থেকে)

অবশ্যই, আপনি দুটি ভিন্ন প্যাকেজের মতো দুটি পৃথক মডিউলের জন্য একই মডিউলটির নাম রাখলে আপনি সমস্যায় দৌড়াতে পারেন

from package1.subpackage import module
from package2.subpackage import module

এক্ষেত্রে অবশ্যই আপনি সমস্যার মধ্যে পড়ে যান তবে তারপরে আপনার প্যাকেজ লেআউটটি ত্রুটিযুক্ত রয়েছে এমন শক্তিশালী ইঙ্গিত রয়েছে এবং আপনাকে এটি পুনর্বিবেচনা করতে হবে।


10
শেষ ক্ষেত্রে, আপনি সর্বদা ব্যবহার করতে পারেন: pkgN.sub.module ModN হিসাবে আমদানি প্রতিটি মডিউলের জন্য আপনাকে আলাদা আলাদা নাম দেয়। আপনি একটি দীর্ঘ নাম সংক্ষিপ্ত করতে 'মডেল হিসাবে ইম্পোর্ট মডিউলনাম' প্যাটার্নটি ব্যবহার করতে পারেন, বা একক নাম পরিবর্তন করে একই এপিআই (উদাহরণস্বরূপ ডিবি এপিআই মডিউল) প্রয়োগের মধ্যে পরিবর্তন করতে পারেন।
জেফ শ্যানন

15
import module

মডিউল থেকে আপনি যখন অনেকগুলি কার্যকারিতা ব্যবহার করবেন তখন সেরা।

from module import function

আপনি কেবল যখন প্রয়োজন তখন মডিউল থেকে সমস্ত ফাংশন এবং প্রকারগুলি সহ গ্লোবাল নেমস্পেসকে দূষিত করা এড়াতে সেরা function


7
বিশ্বব্যাপী নেমস্পেসে অবশ্যই যদি আপনি 'আমদানি মডিউল' করেন তবে 'মডিউল'? আপনি যদি 'থেকে .. আমদানি করুন' 'করেন তবে আপনি কেবলমাত্র নেমস্পেসকে দূষিত করেন।
জন ফুহি

10

আমি এই দুটি পদ্ধতির মধ্যে আরও একটি সূক্ষ্ম পার্থক্য সন্ধান করেছি।

মডিউলটি যদি fooনিম্নলিখিত আমদানি ব্যবহার করে:

from itertools import count

তারপরে মডিউলটি barভুল করে ব্যবহার করতে পারে countযেমন এটি সংজ্ঞায়িত করা হয়েছিল foo, এতে নয় itertools:

import foo
foo.count()

যদি fooব্যবহার করে:

import itertools

ভুলটি এখনও সম্ভব, তবে কম হওয়ার সম্ভাবনা কম। barপ্রয়োজন:

import foo
foo.itertools.count()

এতে আমার কিছুটা ঝামেলা হয়েছিল। আমার একটি মডিউল ছিল যা ভুল করে একটি মডিউল থেকে একটি ব্যতিক্রম আমদানি করে যা এটি সংজ্ঞা দেয় না, কেবল অন্য মডিউল থেকে এটি আমদানি করে (ব্যবহার করে from module import SomeException)। যখন আমদানির আর প্রয়োজন হয় না এবং সরানো হয়, আপত্তিজনক মডিউলটি ভেঙে যায়।


10

এখানে আরও একটি পার্থক্য উল্লেখ করা হয়নি। এটি http://docs.python.org/2/tutorial/modules.html থেকে ভারব্যাটিম অনুলিপি করা হয়েছে

নোট করুন ব্যবহার করার সময়

from package import item

আইটেমটি হয় প্যাকেজের একটি উপ-মডেল (বা সাবপ্যাকেজ) হতে পারে, বা প্যাকেজে সংজ্ঞায়িত অন্য কোনও নাম, যেমন কোনও ফাংশন, শ্রেণি বা পরিবর্তনশীল। আমদানি বিবৃতিটি প্রথমে প্যাকেজে আইটেমটি সংজ্ঞায়িত হয়েছে কিনা তা পরীক্ষা করে; যদি তা না হয় তবে এটি ধরে নেয় এটি একটি মডিউল এবং এটি লোড করার চেষ্টা করে। যদি এটি এটির ব্যর্থ হয়, একটি আমদানি ব্যতিক্রম উত্থাপিত হয়।

বিপরীতে, সিনট্যাক্স ব্যবহার করার সময়

import item.subitem.subsubitem

শেষ ব্যতীত প্রতিটি আইটেম একটি প্যাকেজ হতে হবে; শেষ আইটেমটি মডিউল বা প্যাকেজ হতে পারে তবে পূর্ববর্তী আইটেমে কোনও শ্রেণি বা ফাংশন বা পরিবর্তনশীল সংজ্ঞায়িত হতে পারে না।


আরেকটি জিনিস আমি লক্ষ্য করেছিলাম যে আইটেমটি যদি প্যাকেজের অভ্যন্তরে একটি সাবমডিউল হয় তবে "প্যাকেজ আমদানি আইটেম থেকে" কাজ করে তবে "আমদানি প্যাকেজ" প্যাকেজ.ইটিএম.সুবাইটেম = ... প্যাকেজের খালি আরম্ভের সাথে কাজ করে না , যদি না আমরা প্যাকেজটি খালি শুরু করি unless প্যাকেজের init ফাইলটিতে "আমদানি আইটেম" রয়েছে ।
অমিতোজ দন্ডিয়ানা

6

যেহেতু আমিও একজন শিক্ষানবিস, আমি এটি সহজ উপায়ে ব্যাখ্যা করার চেষ্টা করব: পাইথনে, আমাদের তিন ধরণের importবক্তব্য রয়েছে:

জেনেরিক আমদানি:

import math

এই ধরণের আমদানি আমার ব্যক্তিগত প্রিয়, এই আমদানি কৌশলটির একমাত্র নেতিবাচক দিকটি হ'ল যদি আপনাকে কোনও মডিউলের ফাংশন ব্যবহার করতে হয় তবে আপনাকে নীচের বাক্য গঠনটি অবশ্যই ব্যবহার করতে হবে:

math.sqrt(4)

অবশ্যই এটি টাইপিংয়ের প্রচেষ্টা বৃদ্ধি করে তবে একটি শিক্ষানবিস হিসাবে এটি আপনাকে মডিউল এবং এর সাথে যুক্ত ফাংশন সম্পর্কে নজর রাখতে সহায়তা করবে, (একটি ভাল পাঠ্য সম্পাদক সম্পাদনা টাইপিংয়ের প্রচেষ্টাটিকে উল্লেখযোগ্যভাবে হ্রাস করবে এবং প্রস্তাবিত হয়)।

এই আমদানির বিবৃতিটি ব্যবহার করে টাইপিং প্রচেষ্টা আরও কমানো যেতে পারে:

import math as m

এখন, পরিবর্তে math.sqrt()আপনি ব্যবহার করতে পারেন m.sqrt()

2. ফাংশন আমদানি:

from math import sqrt

আপনার কোডটি কেবলমাত্র মডিউল থেকে একক বা কয়েকটি ফাংশন অ্যাক্সেস করতে হবে তবে মডিউল থেকে কোনও নতুন আইটেম ব্যবহারের জন্য আপনাকে আমদানির বিবরণী আপডেট করতে হবে এই ধরণের আমদানি সবচেয়ে উপযুক্ত।

৩. সর্বজনীন আমদানি:

from math import * 

যদিও এটি টাইপিংয়ের প্রচেষ্টাটিকে উল্লেখযোগ্যভাবে হ্রাস করে তবে এটি প্রস্তাবিত নয় কারণ এটি আপনার কোডটি মডিউল থেকে বিভিন্ন ফাংশন দিয়ে পূর্ণ করবে এবং তাদের নামটি ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলির নামের সাথে বিরোধ করতে পারে। উদাহরণ:

আপনার যদি নিজস্ব নিজস্ব স্কয়ার্টের কোনও ফাংশন থাকে এবং আপনি গণিত আমদানি করেন তবে আপনার ফাংশনটি নিরাপদ: আপনার স্কয়ারটি রয়েছে এবং সেখানে গণিত রয়েছে q আপনি যদি গণিত আমদানি * থেকে করেন তবে আপনার একটি সমস্যা রয়েছে: যথা: হুবহু একই নামের সাথে দুটি পৃথক ফাংশন। সূত্র: কোডেকেডেমি


5
import package
import module

এর সাথে import, টোকেনটি অবশ্যই একটি মডিউল (পাইথন কমান্ডযুক্ত ফাইল) বা একটি প্যাকেজ ( sys.pathকোনও ফাইল ধারণকারী একটি ফোল্ডার __init__.py)) থাকতে হবে

যখন প্যাকেজ রয়েছে:

import package1.package2.package
import package1.package2.module

ফোল্ডারে (প্যাকেজ) অথবা ফাইল (মডিউল) জন্য প্রয়োজনীয়তা একই আছে, কিন্তু ফোল্ডার বা ফাইল থাকতে হবে ভিতরে package2যা ভিতরে হতে হবে package1, এবং উভয় package1এবং package2ধারণ করতে হবে __init__.pyফাইল। https://docs.python.org/2/tutorial/modules.html

fromআমদানির শৈলীর সাথে :

from package1.package2 import package
from package1.package2 import module

প্যাকেজ বা মডিউল পরিবর্তে (বা ) importহিসাবে বিবৃতি সম্বলিত ফাইলের নামস্থানে প্রবেশ করে । আপনি সবসময় আরও সুবিধাজনক নামের সাথে আবদ্ধ হতে পারেন:modulepackagepackage1.package2.module

a = big_package_name.subpackage.even_longer_subpackage_name.function

কেবলমাত্র fromআমদানির শৈলী আপনাকে কোনও নির্দিষ্ট ফাংশন বা পরিবর্তনশীলটির নাম দেওয়ার অনুমতি দেয়:

from package3.module import some_function

অনুমোদিত, কিন্তু

import package3.module.some_function 

অনুমোদিত নয়।


4

লোকেরা যা বলেছে তার সাথে যুক্ত করার জন্য from x import *: নামগুলি কোথা থেকে এসেছে তা আরও জটিল করে তোলার পাশাপাশি এটি পাইলেন্টের মতো কোড চেকারদের ছুঁড়ে ফেলে। তারা নামগুলি অপরিজ্ঞাত ভেরিয়েবল হিসাবে রিপোর্ট করবে।


3

আমার নিজের উত্তরটি বেশিরভাগ ক্ষেত্রে প্রথমে নির্ভর করে যে আমি কতগুলি পৃথক মডিউল ব্যবহার করব। যদি আমি কেবল একটি বা দুটি ব্যবহার করতে যাচ্ছি তবে আমি প্রায়শই ব্যবহার করব from... importযেহেতু এটি বাকী ফাইলটিতে কম কীস্ট্রোক তৈরি করে তবে আমি যদি বিভিন্ন মডিউল ব্যবহার করতে যাচ্ছি তবে আমি কেবল পছন্দ করি importকারণ এর অর্থ হ'ল প্রতিটি মডিউল রেফারেন্স স্ব-ডকুমেন্টিং। চারপাশে শিকার না করে প্রতিটি প্রতীক কোথা থেকে আসে তা আমি দেখতে পাচ্ছি।

ইউসুআললি আমি প্লেইন আমদানির স্ব ডকুমেন্টিং স্টাইলটি পছন্দ করি এবং কেবলমাত্র থেকে বদলে যাই .. আমদানি যখন মডিউলটির নাম টাইপ করতে হয় তার সংখ্যা 10 থেকে 20 এর উপরে বৃদ্ধি পায়, এমনকি সেখানে কেবলমাত্র একটি মডিউল আমদানি করা হচ্ছে।


1

আশ্চর্যজনকভাবে কেউই যে কথা বলেনি তার মধ্যে একটি উল্লেখযোগ্য পার্থক্য আমি খুঁজে পেলাম যে সরল আমদানি ব্যবহার করে আপনি অ্যাক্সেস করতে পারবেন private variableএবং private functionsআমদানি করা মডিউলটি থেকে, যা আমদানি বিবৃতি দিয়ে সম্ভব নয় ।

এখানে চিত্র বর্ণনা লিখুন

ছবিতে কোড:

setting.py

public_variable = 42
_private_variable = 141
def public_function():
    print("I'm a public function! yay!")
def _private_function():
    print("Ain't nobody accessing me from another module...usually")

plain_importer.py

import settings
print (settings._private_variable)
print (settings.public_variable)
settings.public_function()
settings._private_function()

# Prints:
# 141
# 42
# I'm a public function! yay!
# Ain't nobody accessing me from another module...usually

from_importer.py

from settings import *
#print (_private_variable) #doesn't work
print (public_variable)
public_function()
#_private_function()   #doesn't work

0

মডিউল আমদানি করুন - মডিউল থেকে অন্য জিনিস আনতে আপনার অতিরিক্ত পরিশ্রমের দরকার নেই। অপ্রয়োজনীয় টাইপিংয়ের মতো অসুবিধাগুলি রয়েছে

মডিউলটি আমদানি থেকে - কম টাইপিং এবং কোন মডিউলের আইটেমগুলি অ্যাক্সেস করা যায় তার উপর আরও নিয়ন্ত্রণ। মডিউলটি থেকে আপনাকে কোনও নতুন আইটেম ব্যবহার করতে আপনার আমদানি বিবৃতিটি আপডেট করতে হবে।


0

কিছু বিল্টিন মডিউল রয়েছে যা বেশিরভাগ খালি ফাংশন ( বেস 64 , গণিত , ওস , শুটিল , সিস , সময় , ...) ধারণ করে এবং অবশ্যই এই খালি ফাংশনগুলিকে কিছু নেমস্পেসের সাথে আবদ্ধ রাখা এবং এভাবে আপনার পাঠযোগ্যতার উন্নতি সাধন করা ভাল practice কোড। নামগুলির স্থান ছাড়াই এই ফাংশনগুলির অর্থ বুঝতে আরও কতটা কঠিন তা বিবেচনা করুন:

copysign(foo, bar)
monotonic()
copystat(foo, bar)

যখন তারা কিছু মডিউলে আবদ্ধ থাকে তার চেয়ে:

math.copysign(foo, bar)
time.monotonic()
shutil.copystat(foo, bar)

বিভিন্ন মডিউলগুলির মধ্যে দ্বন্দ্ব এড়াতে আপনার কখনও কখনও নেমস্পেসেরও প্রয়োজন হয় ( json.load বনাম pickle.load )


অন্যদিকে কিছু মডিউল বেশিরভাগই শ্রেণীর ধারণ আছে ( configparser , DATETIME , tempfile , জিপ ফাইল , ...) এবং তাদের মধ্যে অনেক তাদের ক্লাসের নাম স্বশাসিত যথেষ্ট করুন:

configparser.RawConfigParser()
datetime.DateTime()
email.message.EmailMessage()
tempfile.NamedTemporaryFile()
zipfile.ZipFile()

সুতরাং আপনার কোডে অতিরিক্ত মডিউল নেমস্পেসের সাথে এই শ্রেণিগুলি ব্যবহার করে কিছু নতুন তথ্য যুক্ত হয়েছে বা কেবল কোড দীর্ঘায়িত করবে কিনা তা নিয়ে বিতর্ক হতে পারে।


0

আমি এটি যুক্ত করতে চাই, আমদানি কলগুলির সময় বিবেচনা করার মতো কিছু বিষয় রয়েছে:

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

mod/
    __init__.py
    main.py
    a.py
    b.py
    c.py
    d.py

main.py:

import mod.a
import mod.b as b
from mod import c
import d

ডিস.ডিস পার্থক্যটি দেখায়:

  1           0 LOAD_CONST               0 (-1)
              3 LOAD_CONST               1 (None)
              6 IMPORT_NAME              0 (mod.a)
              9 STORE_NAME               1 (mod)

  2          12 LOAD_CONST               0 (-1)
             15 LOAD_CONST               1 (None)
             18 IMPORT_NAME              2 (b)
             21 STORE_NAME               2 (b)

  3          24 LOAD_CONST               0 (-1)
             27 LOAD_CONST               2 (('c',))
             30 IMPORT_NAME              1 (mod)
             33 IMPORT_FROM              3 (c)
             36 STORE_NAME               3 (c)
             39 POP_TOP

  4          40 LOAD_CONST               0 (-1)
             43 LOAD_CONST               1 (None)
             46 IMPORT_NAME              4 (mod.d)
             49 LOAD_ATTR                5 (d)
             52 STORE_NAME               5 (d)
             55 LOAD_CONST               1 (None)

শেষ পর্যন্ত তারা একই দেখায় (প্রতিটি উদাহরণের মধ্যে STORE_NAME ফলাফল হয়), তবে আপনাকে নিম্নলিখিত চারটি বৃত্তাকার আমদানি বিবেচনা করতে হবে কিনা তা লক্ষণীয়:

example1

foo/
   __init__.py
   a.py
   b.py
a.py:
import foo.b 
b.py:
import foo.a
>>> import foo.a
>>>

এইটা কাজ করে

example2

bar/
   __init__.py
   a.py
   b.py
a.py:
import bar.b as b
b.py:
import bar.a as a
>>> import bar.a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "bar\a.py", line 1, in <module>
    import bar.b as b
  File "bar\b.py", line 1, in <module>
    import bar.a as a
AttributeError: 'module' object has no attribute 'a'

কোন পাশা

example3

baz/
   __init__.py
   a.py
   b.py
a.py:
from baz import b
b.py:
from baz import a
>>> import baz.a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "baz\a.py", line 1, in <module>
    from baz import b
  File "baz\b.py", line 1, in <module>
    from baz import a
ImportError: cannot import name a

অনুরূপ ইস্যু ... তবে স্পষ্টভাবে x ইম্পোর্ট y থেকে y ইম্পোর্ট আমদানি xy এর মতো নয়

example4

qux/
   __init__.py
   a.py
   b.py
a.py:
import b 
b.py:
import a
>>> import qux.a
>>>

এই এক কাজ করে


0

এটি আমার বর্তমান ডিরেক্টরিটির ডিরেক্টরি কাঠামো:

.  
└─a  
   └─b  
     └─c
  1. importবিবৃতি স্মরণ সব অন্তর্বর্তী নাম
    এই নামগুলি যোগ্য হতে হবে :

    In[1]: import a.b.c
    
    In[2]: a
    Out[2]: <module 'a' (namespace)>
    
    In[3]: a.b
    Out[3]: <module 'a.b' (namespace)>
    
    In[4]: a.b.c
    Out[4]: <module 'a.b.c' (namespace)>
  2. from ... import ...বিবৃতিটিতে কেবল আমদানিকৃত নাম মনে পড়ে ।
    এই নামটি অবশ্যই যোগ্য নয়:

    In[1]: from a.b import c
    
    In[2]: a
    NameError: name 'a' is not defined
    
    In[2]: a.b
    NameError: name 'a' is not defined
    
    In[3]: a.b.c
    NameError: name 'a' is not defined
    
    In[4]: c
    Out[4]: <module 'a.b.c' (namespace)>

  • দ্রষ্টব্য: অবশ্যই আমি 1 এবং 2 পদক্ষেপের মধ্যে আমার পাইথন কনসোলটি পুনরায় শুরু করেছি।

0

জান ভ্রোবেল যেমন উল্লেখ করেছেন, বিভিন্ন আমদানির একটি দিক হ'ল উপায়টি কীভাবে আমদানি প্রকাশ করা হয়।

মডিউল পুরাণ

from math import gcd
...

পৌরাণিক কাহিনী ব্যবহার :

import mymath
mymath.gcd(30, 42)  # will work though maybe not expected

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

পরিবর্তে ব্যবহার করে এটিকে আরও কিছুটা অস্পষ্ট করার জন্য জান ওরোবেলের প্রস্তাবনা বাদ দিয়ে import math, আমি একটি অগ্রণী আন্ডারস্কোর ব্যবহার করে প্রকাশ থেকে আমদানিগুলি গোপন করতে শুরু করেছি:

# for instance...
from math import gcd as _gcd
# or...
import math as _math

বৃহত্তর প্রকল্পগুলিতে এই "সেরা অনুশীলন" আমাকে পরবর্তী নিয়ন্ত্রণে আমদানিতে কী প্রকাশিত হয় এবং কী নয় তা হুবহু নিয়ন্ত্রণ করতে দেয়। এটি আমার মডিউলগুলি পরিষ্কার রাখে এবং প্রকল্পের একটি নির্দিষ্ট আকারে অর্থ প্রদান করে।

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