كيف أتأكد من كل ما عندي من بيثون كود "بتجميع"؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

وخلفيتي هي C و C ++. أنا أحب بيثون الكثير، ولكن هناك جانبا واحدا منه (وغيرها من اللغات تفسيرها أعتقد) أن من الصعب حقا للعمل مع عندما كنت تستخدم اللغات المترجمة.

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

ومن الواضح أن النظام يجب أن يتم اختبار يكفي للتأكد من تم تشغيل كل رمز، ولكن في معظم الوقت يمكنني استخدام بايثون للمخطوطات في المنزل والأدوات الصغيرة، التي فكورسي لم يحصل على QA الاهتمام التي يحتاجون إليها. أيضا، بعض رمز بسيط بحيث (إذا خلفيتك C / C ++) تعرف أنها سوف تعمل بشكل جيد طالما أنه يجمع (على سبيل المثال، جالبة-طرق داخل الطبقات، وعادة ما يكون عودة بسيطة من متغير عضو).

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

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

المحلول

PyChecker و <لأ href = "http://www.logilab.org/857" يختلط = "noreferrer"> PyLint .

إليك مثال الإخراج من pylint، الناتجة عن برنامج تافهة:

print a

وكما ترون، يكشف متغير غير معروف، الذي py_compile سوف لا (عمدا).

in foo.py:

************* Module foo
C:  1: Black listed name "foo"
C:  1: Missing docstring
E:  1: Undefined variable 'a'


...

|error      |1      |1        |=          |

والمثال المبسط لماذا الاختبارات ليست جيدة بما فيه الكفاية، حتى لو أنها تغطي "كل سطر":

bar = "Foo"
foo = "Bar"
def baz(X):
    return bar if X else fo0

print baz(input("True or False: "))

وتحرير: PyChecker يعالج الثلاثي بالنسبة لي:

Processing ternary...
True or False: True
Foo

Warnings...

ternary.py:6: No global (fo0) found
ternary.py:8: Using input() is a security problem, consider using raw_input()

نصائح أخرى

وقد ذكر

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

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

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

إذا كنت تستخدم الكسوف مع بيديف باعتبارها IDE، فإنه يمكن العلم العديد من الأخطاء المطبعية لك مع الأحمر squigglies على الفور، ولها التكامل Pylint جدا. على سبيل المثال:

foo = 5
print food

وسوف يتم وضع علامة على أنها "غير معرف متغير: الغذاء". بالطبع هذه ليست دائما دقيقة (ربما تم تعريف الغذاء في وقت سابق باستخدام setattr أو التقنيات الغريبة الأخرى)، لكنه يعمل بشكل جيد في معظم الوقت.

في عام، يمكنك تحليل فقط بشكل ثابت التعليمات البرمجية لدرجة أن التعليمات البرمجية هو ثابت في الواقع. وأكثر ديناميكية التعليمات البرمجية الخاصة بك هو، واختبار أكثر كنت حقا بحاجة الآلي.

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

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