هل لدى Python شيئا مثل C ++ باستخدام الكلمة الرئيسية؟

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

  •  23-08-2019
  •  | 
  •  

سؤال

في C ++، يمكنك في كثير من الأحيان تحسين قابلية قراءة التعليمات البرمجية بشكل كبير عن طريق الاستخدام الدقيق للكلمة الرئيسية "باستخدام"، على سبيل المثال:

void foo()
{
    std::vector< std::map <int, std::string> > crazyVector;
    std::cout << crazyVector[0].begin()->first;
}

يصبح

void foo()
{
    using namespace std; // limited in scope to foo
    vector< map <int, string> > crazyVector;
    cout << crazyVector[0].begin()->first;
}

هل هناك شيء مماثل موجود لبيتثون، أو هل يجب أن أكون مؤهلا تماما كل شيء؟

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

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

المحلول

كما قال بيل، يصب بيثون البناء

from X import *

ولكن يمكنك أيضا تحديد الأسماء التي تريدها بشكل صريح من الوحدة النمطية (مساحة الاسم):

from X import foo, bar, blah

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

تعديل: ردا على تعليق باكس، سأذكر أنه يمكنك أيضا كتابة أشياء مثل

import X.foo

ولكن بعد ذلك سوف تحتاج إلى الكتابة

X.foo.moo()

بدلا من مجرد

foo.moo()

هذا ليس بالضرورة شيئا سيئا، بالطبع. أنا عادة استخدام مزيج من from X import y و import X.y النماذج، أيا كان أشعر أن أشعر بها. إنه بالتأكيد شيء شخصي إلى حد ما.

نصائح أخرى

import X

أو

from X import *

أو

from X import a, b, c

حيث X هي وحدة بيثون التي تريد استخدامها.

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

بالتأكيد، ديناميكية بيثون تجعل هذا تافهة. إذا كان لديك فئة دفن في أعماق مساحة الاسم: foo.bar.baz.blah، يمكنك القيام به:

def foo:
    f = foo.bar.baz.blah
    f1 = f()

بالإضافة إلى إجابة ديفيد:

  1. يجب على المرء استخدام الأقواس المستديرة في from X import (foo, bar, blah) من أجل بيب 8..
  2. يسمح بناء الجملة الكامل بإعادة تسمية (Rebinding) أسماء المعرفات الجديدة في نطاق الوحدة الحالية كما هو الحال في from foo import bar as baz.

أوصي للبحث عن دليل ل استيراد الكلمة الرئيسية, ، ال __import__ المدمج والشرح ل sys.modules. كما قراءة أخرى.

خيار آخر في Python هو بناء "باسم" عند الاستيراد. علي سبيل المثال:

from foo import bar as baz

هذا سوف يجلب foo.bar في أما baz في الوحدة الحالية التي تسمح للكيان بالحصول على اسم مختلف في الوحدة النمطية الحالية، من المحتمل تجنب إخفاء كيان موجود في الوحدة النمطية الحالية بنفس الاسم.

لاحظ أن

from foo import bar

يعمل حتى إذا bar هي وحدة في foo صفقة. يتيح لك ذلك تحديد تلوث مساحة اسمك دون الحاجة إلى تسمية كل وظيفة / فئة في foo.bar أنك قد تهتم للاستخدام. كما أنه يساعد القراء في التعليمات البرمجية الخاصة بك، لأنهم سوف يرون مكالمة bar.baz() ولدي فكرة أفضل أين baz جاء من.

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