هل لدى Python شيئا مثل C ++ باستخدام الكلمة الرئيسية؟
-
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()
بالإضافة إلى إجابة ديفيد:
- يجب على المرء استخدام الأقواس المستديرة في
from X import (foo, bar, blah)
من أجل بيب 8.. - يسمح بناء الجملة الكامل بإعادة تسمية (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
جاء من.