سؤال

لقد رأيت بعض الثعبان المبرمجين استخدام النمط التالي على الدوام إلى حد ما (سوف نطلق عليه نمط 1):

import some_module
# Use some_module.some_identifier in various places.

من أجل دعم هذا النمط ، يمكنك الاستشهاد "صراحة هو أفضل من ضمني" مكسيم.لقد رأيت البعض المبرمجين استخدام هذا النمط (نمط 2):

from some_module import some_identifier
# Use some_identifier in various places.

الفائدة الأساسية التي أراها في نمط 2 هو الصيانة-وخاصة مع بطة الكتابة المثل قد ترغب في مبادلة some_module على some_other_module.أشعر أيضا نمط 2 انتصارات نقاط مع "القراءة التهم" ، مكسيم.على الرغم من أنني أميل إلى الاختلاف ، يمكن للمرء أن يجادل دائما أن البحث و استبدال هو مجرد جيدة الخيار عند استخدام النمط الأول.

إضافة: وأشير إلى أنه يمكن استخدام as حل التبديل من some_module إلى some_other_module في النمط 1.نسيت أن أذكر أنه من الشائع أيضا أن تقرر تنفيذ some_identifier في الحالي وحدة الذي يجعل إنشاء ما يعادلها some_module حاوية محرجا قليلا.

هل كانت مفيدة؟

المحلول

هناك استخدامات كل الحالات, لذلك أنا لا أعتقد أن هذا هو إما أو قضية.أود أن تنظر في استخدام من وحدة import x,y,z عندما:

  • هناك مجموعة صغيرة نسبيا من الاستيراد

  • الغرض من وظائف المستوردة واضح عندما طلق من اسم الوحدة النمطية.إذا كانت أسماء عامة إلى حد ما ، قد الصدام مع الآخرين و اقول لكم قليلا.على سبيل المثال.رؤية remove يقول لك قليلا, ولكن os.remove ربما إشارة إلى أن كنت تتعامل مع الملفات.

  • أسماء لا الصدام.على غرار ما سبق ، ولكن الأهم. أبدا لا شيء من هذا القبيل:

     from os import open
    

import module [as renamed_module] لديه ميزة أنه يعطي أكثر قليلا السياق حول ما يسمى عند استخدامه.لا بد أن هذا هو أكثر قليلا تشوش عند وحدة ليس إعطاء معلومات أكثر و أقل قليلا performant (2 عمليات البحث بدلا من 1).

كما أن لديها مزايا عند اختبار ومع ذلك (على سبيل المثال.استبدال نظام التشغيل.فتح مع كائن وهمي دون الحاجة إلى تغيير كل وحدة) ، ينبغي أن تستخدم عند استخدام وحدات قابلة للتغيير, مثل

import config
config.dburl = 'sqlite:///test.db'

إذا كنت في شك, كنت دائما أذهب مع import module نمط.

نصائح أخرى

مع وجود بناء الجملة التالي:

import some_other_module as some_module

الصيانة الحجة من النمط 2 لم تعد ذات الصلة.

أنا أميل إلى استخدام أسلوب 1.عادة أجد أنني صراحة المرجعية المستوردة اسم حزمة فقط بضع مرات في نموذجي برنامج بيثون.كل شيء آخر هو الطرق على الكائن ، والتي بالطبع لا تحتاج إلى الرجوع إلى حزمة المستوردة.

وعادة ما تستخدم عتبة أن تقرر ذلك.إذا كنت ترغب في استخدام الكثير من الأشياء داخل some_module, سأستخدم:

import some_module as sm
x = sm.whatever

إذا كان هناك واحد فقط أو اثنين من الأشياء التي كنت بحاجة إلى:

from some_module import whatever
x = whatever

هذا على افتراض أنني لا أحتاج whatever من some_other_module, بالطبع.

أنا أميل إلى استخدام as شرط على الواردات حتى أستطيع أن يقلل من الكتابة و substitue آخر وحدة بسهولة في المستقبل.

أنا أفضل أن import X ومن ثم استخدام X.a بقدر الإمكان.

بلدي استثناء مراكز على متداخلة وحدات في إطار كبير مثل Django.حدة أسماء تميل إلى الحصول على مطولة ، أمثلة على كل قول from django.conf import settings أن توفر لك الكتابة django.conf.settings.DEBUG في كل مكان.

إذا كان اسم الوحدة النمطية متداخلة ، ثم الاستثناء هو استخدام from X.Y.Z import a.

أجد أن التدوين

from some_module import some_symbol

يعمل بشكل أفضل في معظم الحالات.أيضا ، في حال من اسم صراع الرمز ، يمكنك استخدام:

from some_module import some_symbol as other_symbol

كما السؤال الدول ، فإنه يتجنب كتابة اسم الوحدة النمطية في كل وقت, في كل مرة مع خطر mistyping ذلك.أنا استخدم بناء الجملة:

import  module [as other_module]

إلا في حالتين:

  1. أنا استخدم الكثير من وظائف وحدة/الكائنات إلى استيراد كل منهم
  2. وتعرف وحدة بعض الرموز التي قد تتغير أثناء التنفيذ

أنا شخصيا حاول أن لا تعبث كثيرا مع مساحة الاسم ، وذلك في معظم الحالات أنا فقط تفعل

import module  

أو استيراد وحدة الدفاع

الحقيقي الوحيد رسام هو عندما يكون لدي وحدة مع واحد من الدرجة التي تستخدم الكثير.إذا كان sublclassed a list نوع لإضافة بعض funcionality هناك, كنت استخدم

from SuperImprovedListOverloadedWithFeatures import NewLIst
nl = NewList()

الخ.

أنا أميل إلى استخدام سوى عدد قليل من الأعضاء من كل وحدة ، لذلك هناك الكثير من

from john import cleese
from terry import jones, gilliam

في قانون بلدي.سوف استيراد كامل وحدات (مثل os أو wx) إذا كنت تتوقع أن يكون استخدام أكثر من وحدة وحدة اسم قصير.أنا أيضا استيراد كامل وحدات إذا كان هناك تعارض اسم أو أريد أن أذكر القارئ ما هي وظيفة المرتبطة.

import michael
import sarah

import wave

gov_speech = wave.open(sarah.palin.speechfile)
parrot_sketch = wave.open(michael.palin.justresting)

(يمكنني استخدام from wave import open as wave_open, ولكن أعتقد أن wave.open سوف تكون أكثر دراية القارئ.

أعتقد في أحدث إصدارات بيثون (2.5+?يجب التحقق من الوقائع...) حتى يمكنك القيام به:

import some_other_module as some_module

لذلك يمكن أن تذهب لا يزال مع النمط 1 و المبادلة في وحدة نمطية مختلفة في وقت لاحق.

أعتقد أنه عموما خرائط وكم كنت تريد أن تحدث فوضى مساحة الاسم الخاصة بك.سوف تكون باستخدام واحد أو اثنين من الأسماء في الوحدة ؟ أو كل منهم (from x import * ليست دائما سيئة ، فقط عموما) ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top