سؤال

هذا السؤال كان يؤرقني لفترة طويلة (كما يتضح من سؤالي السابق):لماذا هو بالضبط print(x) أفضل (التي تعرف بأنها أكثر pythonic) من print x?

بالنسبة لأولئك الذين لا يعرفون ، print بيان تغير في وظيفة في بيثون 3.0.الوثائق الرسمية في بيب 3105 و الدافع هو في Guido van Rossum البريد الإلكتروني.

إلى تلك النقاط أود أن جعل الطباق:

  1. وهناك شركات أخرى مثل import الذي نكتب بيانا ، على الرغم من أن وظيفة هو في الواقع تكرار مع وظيفة __import__
    • للمبتدئين, المشغل print لا تنتمي إلى منطق التطبيق.لهم انها غامضة المشغل الذي هو تتويج البرنامج.أنها تتوقع أن ننظر بشكل مختلف.
    • جميع المبتدئين الكتب التي كانت تصف الأساسية بيثون 2.× الآن ضمان أن تكون مكسورة من المثال الأول.بالتأكيد, اللغات في بعض الأحيان تغيير ، ولكن هذه التغييرات عادة ما تكون أقل وضوحا للمستخدمين المبتدئين.
    • انها ليست واضحة على الفور لي أن وظائف print يمكن أن تتكرر على مستوى التطبيق.على سبيل المثال, في بعض الأحيان كنت ترغب في إعادة توجيه الطباعة من وحدة التحكم مشروط نظام التشغيل الحوار.
    • في حين أن الناس يقولون إنه من الصعب كتابة كل print البيانات إلى وظيفة وأجبروا كل بيثون 2.x المطور للقيام بذلك بالضبط لجميع مشاريعها.جيد, ليس من الصعب التلقائي مع محول.
    • كل من يتمتع وجود القدرة على التعامل مع وظيفة print سيكون جيدا لو print بيان التفاف وظيفة __print__.

إذا هل يمكننا من فضلك الكنسي الإجابة على هذا السؤال على صفحات تجاوز سعة مكدس?

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

المحلول

يبدو لي أن لك هو النقاش وليس سؤال ... هل أنت حقا الذهاب إلى قبول إجابة هذا يدل على مدى عمق و خاطئ للغاية كنت في وتأكيدات؟!

على مناقشة نقاط:

وهناك شركات أخرى مثل استيراد التي نكتب بوصفه البيان ، على الرغم من وظيفة هو في الواقع تتكرر مع وظيفة __import__

خاطئ تماما:وظيفة __import__ (مثل كل وظيفة أخرى-و مشغل لهذه المسألة) يربط لا أسماء في نطاق "المتصل" (التعليمات البرمجية التي تحتوي عليه) - أي "أيا" الذي يربط الأسماء في "المتصل نطاق" يجب أن أن بيان (تماما مثل مهمة ، def, ، call).الخاص بك "نقطة" يبدو تماما تفوت عميقة للغاية وحاسمة يميز هذا الثعبان تعادلات بين البيانات والتعبيرات -- واحد المعقول كره هذا التمييز ، ولكن تجاهل هو الأكثر وضوحا ببساطة خطأ.

بيثون البيانات الأشياء Python مترجم يجب أن يكون على وجه التحديد على علم -- أنها قد يغير ملزمة من الأسماء قد يغير التحكم في التدفق و/أو قد تحتاج إلى إزالتها تماما من ولدت بايت كود في ظروف معينة (وهذا الأخير ينطبق على assert). print كان فقط الاستثناء من هذا التأكيد في بيثون 2;قبل إزالته من قائمة البيانات ، بيثون 3 يزيل استثناء ، يجعل العامة التأكيد "مجرد عقد" ، وبالتالي هو أكثر اللغة العادية. حالات خاصة ليست خاصة بما فيه الكفاية لكسر القواعد منذ فترة طويلة Pythonic تينيت (لا import this في تفاعلية مترجم >>> موجه إلى رؤية "زين الثعبان" عرض) و هذا التغيير إلى اللغة يزيل انتهاك هذا المبدأ أن تبقى لسنوات عديدة بسبب مبكر الخاطئة تصميم المقرر.

للمبتدئين, مشغل الطباعة لا لا تنتمي إلى التطبيق العام المنطق.لهم انها غامضة المشغل الذي هو تتويج برنامجهم.أنهم يتوقعون أن تبدو بشكل مختلف.

علاج للمبتدئين من المفاهيم الخاطئة في أقرب وقت ممكن هو أمر جيد جدا.

جميع المبتدئين الكتب التي كانت واصفا الأساسية بيثون 2.× الآن ضمان أن تكون مكسورة من قبضة على سبيل المثال.بالتأكيد, لغات في بعض الأحيان التغييرات ، ولكن التغييرات عادة ما تكون أقل وضوحا للمستخدمين المبتدئين.

اللغات نادرا ما تتغير في العمق إلى الوراء-لا تتفق الطرق (الثعبان يفعل ذلك عن مرة واحدة في العقد) و قليل من ميزات اللغة هي "واضحة للغاية على المبتدئين" ، وبالتالي فإن إجمالي عدد من الملاحظات الصغيرة-حتى الآن وحتى في الصغيرة البوصلة ونحن يمكن بسهولة العثور على أمثلة مضادة ، حيث ميزة واضحة للغاية للمبتدئين فقط كنت مصممة بشكل سيئ أن إزالة كان جيدا يستحق كل هذا الاضطراب.على سبيل المثال, الحديثة اللهجات الأساسية ، مثل Microsoft Visual Basic, لا تستخدم صريحة من المستخدم إدخال أرقام الأسطر ، "الميزة" التي كان رهيب و واضح للغاية على الاطلاق الجميع منذ أن كان إلزاميا في أوائل اللهجات الأساسية.المتغيرات الحديثة اللثغة (من مخطط فصاعدا) لا تستخدم النطاق الديناميكي ، misfeature التي كانت للأسف واضح للغاية (عادة يظهر كما يصعب فهم الخلل في التعليمات البرمجية الخاصة بهم) للمبتدئين ، أساسا في أقرب وقت كما أنها بدأت في كتابة الوظائف في اللثغة 1.5 (كنت مبتدئا في ذلك ويمكن أن يشهد كم عضني).

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

لا أفهم هذه "النقطة".مجرد تغيير sys.stdout إلى المفضلة لديك الزائفة كائن الملف وإعادة توجيه إلى قلبك محتويات -- لديك الخيار القرد الترقيع المدمج في وظيفة print (الذي لم يكن في بيثون 2) لكن لا أحد يلوي ذراعك و يجبرك على القيام بذلك.

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

على 2to3 أداة لا بل تأخذ الرعاية من كل هذه سهلة سطح عدم التوافق-لا عرق (وأنه يحتاج إلى تشغيل على أي حال أن تأخذ الرعاية من عدد قليل من أكثر من جانب print, حتى الناس استخدامها على نطاق واسع).إذن ما هي "نقطة" هنا ؟

كل من يتمتع وجود القدرة التعامل مع وظيفة الطباعة سيكون كما خدم جيدا إذا كانت الطباعة بيان التفاف وظيفة طباعة.

مثل هذا الترتيب لا في حد ذاتها إزالة لا لزوم لها الكلمة (و لا غير مبرر مخالفة, كما شرحت أعلاه:بيان أن لديه لا سبب وجيه يكون بيان لأنه ليس هناك على الاطلاق لا حاجة المترجم أن يكون خصيصا على علم بأي طريقة أو شكل أو صورة!).من الواضح لي أن وجود مثل هذا الكامنة وظيفة تضيف أي قيمة حقيقية ، ولكن إذا كان لديك الحقيقي حالات الاستخدام يمكنك بالتأكيد اقتراح الحال في بيثون الأفكار القائمة البريدية-مثل هذا الكامنة وظيفة ، إذا ثبت أن الثمينة في الواقع ، يمكن تحديثه وتعديله لاستخدامها من قبل print بيان في بايثون 2.7 وكذلك print وظيفة في بيثون 3.2.

ومع ذلك, النظر في الحالة النموذجية التي قد ترغب القرد-التصحيح المدمج في print:إضافة الكلمات الرئيسية الحجج للسماح الهوى القرص.كيف __print__ الدالة على ما يبدو انت المقترحة من أي وقت مضى قه تلك KW الحجج من __print__ البيان ؟ بعض funkier الجملة بعد من أهوال >> myfile و زائدة فاصلة...?!مع print بوصفها وظيفة, الكلمة الحجج اتبع فقط طبيعي و عادي القواعد التي تنطبق على كل وظيفة استدعاء دالة -- النعيم!

لذا باختصار, انها أكثر Pythonic على print أن تكون وظيفة لأنه يزيل الهالات الحالات الخاصة ، و أي حاجة غريبة استثنائية بناء الجملة -- البساطة والانتظام التوحيد هي بايثون العلامات التجارية.

نصائح أخرى

هنا هو السبب في أنني أكره طباعة البيان في 2.x.

>>> something()
<something instance at 0xdeadbeef>
>>> print something()
<something instance at 0xdeadbeef>

لا قيمة لها كائن ليس له فائدة __str__, حسنا, أستطيع التعامل ، أنظر في ذلك بعض أكثر.

>>> dir(something())
['foo', 'bar', 'baz', 'wonderful']
>>> help(something().foo)
"foo(self, callable)"

همم..هل هذا للاستدعاء اتخاذ الحجج ؟

>>> something().foo(print)
    something().foo(print)
                        ^
SyntaxError: invalid syntax
>>> something().foo(lambda *args: print(*args))
    something().foo(lambda *args: print(*args))
                                      ^
SyntaxError: invalid syntax

لذا...أما علي أن تعريف وظيفة استخدام

>>> def myPrint(*args): print *args
    def myPrint(*args): print *args
                              ^
SyntaxError: invalid syntax
>>> def myPrint(*args): print args
...
>>> myPrint(1)
(1,)

قشعريرة, أو استخدام sys.stdout.write, التي cludgy ، لما لها سلوك مختلف جدا من print.كما يبدو مختلفة, مما يعني أنا تقريبا لم تذكر أنه موجود.

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

على print بيان يحمل أيضا غير عادية >> جملة الطباعة إلى ملف معين.لا يوجد أي بيان آخر في بيثون الذي يحتوي على هذه الجملة ، لذلك هو غير عادي في هذا الطريق.

أعتقد أنك على حق على الرغم من أن معظم المشاكل مع print البيان كان يمكن حلها عن طريق إدخال __print__ وظيفة.

وجدت GvR في "الطباعة هو التطبيق الوحيد على مستوى الوظائف التي لديها بيان مخصصة لذلك" مقنعة.بيثون هو للأغراض العامة اللغة, و لا ينبغي أن يكون بيان إخراج تيار باعتبارها المشغل أو الكلمات الرئيسية.

ليس pythonic لأن الجملة يجب أن تكون:

stdout.append("Hello World")

أو

stdout += "hello world"

تنويه:أنا مثل الثعبان حقا.

ملاحظة مهمة وجدية حول ...

أعتقد أن هذا الثعبان هو كائن نموذج 'تنفيذ ذلك بنفسك' نهج أشياء مثل السمة الرؤية العظيمة.أعتقد أن هذا كل شيء هو كائن نهج OOP و حتى الكائنات تعريفها بأنها مجموعة من الكائنات هيكل واضح جدا في التفكير.

ما أخشاه الثعبان سوف تصبح لغة لا يقدم النوايا بطريقة واضحة ...وأنا أكره أن أرى جمال المبادئ تتورط في التفكير بالفعل غير تقليدية الجملة العرض.نوع من مثل Lisp, الجميل في الأمر بنية قاتمة ، imho في الجملة.

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