ممارسة جيدة أو سيئة في بايثون:استيراد في منتصف الملف

StackOverflow https://stackoverflow.com/questions/1188640

  •  19-09-2019
  •  | 
  •  

سؤال

لنفترض أن لدي وحدة نمطية طويلة نسبيًا، ولكني أحتاج إلى وحدة نمطية أو طريقة خارجية مرة واحدة فقط.

هل يعتبر استيراد هذه الطريقة أو الوحدة في منتصف الوحدة أمرًا مقبولًا؟

أو ينبغي importيكون فقط في الجزء الأول من الوحدة.

مثال:

import string, pythis, pythat
...
...
...
...
def func():
     blah
     blah 
     blah
     from pysomething import foo
     foo()
     etc
     etc 
     etc
...
...
...

يرجى تبرير إجابتك وإضافة روابط إليها بيبق أو المصادر ذات الصلة

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

المحلول

بيب 8. الولايات الرسمية:

يتم وضع الواردات دائما في الجزء العلوي من الملف، فقط بعد أي تعليقات وحدة ومسكرات، وقبل وحدة العالم والثوابت.

يجب أن يكون PEP 8 أساس أي دليل على الطراز "في المنزل"، لأنه يلخص ما وجد فريق بيثون الأساسي هو أن يكون الأكثر فعالية، بشكل عام (ومع المعارضة الفردية بالطبع، كما هو الحال في أي لغة أخرى، ولكن إجماع وتوافق BDFL على PEP 8).

نصائح أخرى

كان هناك مناقشة مفصلة لهذا الموضوع في القائمة البريدية لبثون في عام 2001:

https:/mail.python.org/pipermail/python-list/2001-july/071567.html

لقد ذكر الجميع بالفعل Peps، ولكن أيضا رعاية ليس لديهم بيانات الاستيراد في منتصف التعليمات البرمجية. على الأقل تحت Python 2.6، هناك العديد من التعليمات الثنائية الأخرى المطلوبة عند وجود وظيفة عبارة استيراد.

>>> def f():
    from time import time
    print time()

>>> dis.dis(f)
  2           0 LOAD_CONST               1 (-1)
              3 LOAD_CONST               2 (('time',))
              6 IMPORT_NAME              0 (time)
              9 IMPORT_FROM              0 (time)
             12 STORE_FAST               0 (time)
             15 POP_TOP             

  3          16 LOAD_FAST                0 (time)
             19 CALL_FUNCTION            0
             22 PRINT_ITEM          
             23 PRINT_NEWLINE       
             24 LOAD_CONST               0 (None)
             27 RETURN_VALUE

>>> def g():
    print time()

>>> dis.dis(g)
  2           0 LOAD_GLOBAL              0 (time)
              3 CALL_FUNCTION            0
              6 PRINT_ITEM          
              7 PRINT_NEWLINE       
              8 LOAD_CONST               0 (None)
             11 RETURN_VALUE  

إذا كانت الوحدة المستوردة يتم استخدامها بشكل غير متكرر وكان الاستيراد مكلفًا، فلا بأس بالاستيراد في الوسط.

وإلا فهل من الحكمة اتباع اقتراح أليكس مارتيلي؟

يعتبر عموما ممارسة سيئة، لكن في بعض الأحيان يكون أمرا لا مفر منه (يقول عندما يتعين عليك تجنب استيراد دائري).

مثال على الوقت الذي يحدث فيه: أنا استخدم واف لبناء جميع الكود لدينا. يتم تقسيم النظام إلى أدوات، ويتم تطبيق كل أداة في الوحدة النمطية الخاصة بها. كل وحدة أداة يمكن أن تنحيد detect() طريقة للكشف عن ما إذا كانت المتطلبات المسبقة موجودة. مثال واحد من هذه قد يقوم بما يلي:

def detect(self):
    import foobar

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

يعتبر "نموذجا جيدا" لمجموعة جميع الواردات معا في بداية الملف.

يمكن لوحات استيراد وحدات أخرى. من المعتاد ولكن غير مطلوب لوضع جميع بيانات الاستيراد في بداية الوحدة النمطية (أو البرنامج النصي، لهذه المسألة). يتم وضع أسماء الوحدات النمطية المستوردة في جدول الرموز العالمي للاستيراد في الوحدة النمطية.

من هنا: http://docs.python.org/tutorial/modules.html.

95٪ من الوقت، يجب عليك وضع جميع الواردات الخاصة بك في الجزء العلوي من الملف. حالة واحدة قد ترغب فيها في إجراء استيراد محلي دالة إذا كان عليك القيام بذلك من أجل تجنب الواردات الدائرية. قل foo.py واردات bar.py، وست وظيفة في bar.py لاستيراد شيء ما من foo.py. إذا وضعت كل ما تبذلونه من الواردات في الأعلى، فقد يكون لديك مشاكل غير متوقعة استيراد الملفات التي تعتمد على المعلومات التي لم يتم تجميعها حتى الآن. في هذه الحالة، فإن امتلاك وظيفة استيراد محلية يمكن أن تسمح الكود الخاص بك في استيراد الوحدة النمطية الأخرى حتى يتم تجميع الكود بالكامل، وتسمم الوظيفة ذات الصلة.

ومع ذلك، يبدو أن حالة استخدامك أكثر حول مما يجعل من الواضح أين يأتي FOO () من. في هذه الحالة، كنت أفضل بكثير من شيئين:

أولا، بدلا من

from prerequisite import foo

استيراد المتطلب السابق مباشرة، والذات في وقت لاحق الرجوع إليها كما المتطلب السابق .foo. يدفع Verbosity المزيف نفسه في البستوني من خلال زيادة شفافية التعليمات البرمجية.

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

بيب 8.:

يتم وضع الواردات دائما في الجزء العلوي من الملف، فقط بعد أي تعليقات وحدة ومسكرات، وقبل وحدة العالم والثوابت.

ليست ممارسة سيئة لاستيراد الواردات. بحيث تنطبق الاستيراد فقط على الوظيفة التي استخدمتها فيها.

أعتقد أن الكود سيكون أكثر قابلية للقراءة على الرغم من أن الواردات حيث تم تجميعها معا في الجزء العلوي من الكتلة أو إذا كنت تريد ذلك على مستوى العالم في الجزء العلوي من الملف.

حسنا، أعتقد أنه من الممارسات الجيدة تجميع جميع الواردات معا في بداية الملف لأن الجميع يعرف أين ننظر إذا كنت تريد أن تعرف أن Libs محملة

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