أعلى gotchas لشخص ينتقل من lang static (Java/c#) إلى لغة ديناميكية مثل Python

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

  •  02-10-2019
  •  | 
  •  

سؤال

ما هي أفضل مسكات للشخص الذي ينتقل من لانج ثابت (Java/C#) إلى لغة ديناميكية مثل Python؟

يبدو رائعًا كيف يمكن القيام بالأمور ، ولكن إعادة تسمية طريقة ، أو إضافة/إزالة المعلمات تبدو محفوفة بالمخاطر!

هل الحل الوحيد لكتابة اختبارات لكل طريقة؟

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

المحلول

أود أن أقول إن رقم واحد يحاول أن يكتب الكود المكتوب بشكل ثابت بلغة ديناميكية.

لا تتردد في استخدام معرف للإشارة إلى سلسلة ثم قائمة في أقسام كود قائمة بذاتها

keys = 'foo bar foobar' # Imagine this coming in as an argument
keys = keys.split() # Now the semantically chose name for the argument can be 
                    # reused As the semantically chosen name for a local variable

لا تتردد في علاج وظائف مثل القيم العادية: فهي كذلك. خذ المحلل التالي. لنفترض أننا نريد التعامل مع جميع علامات الرأس على حد سواء وعلامات UL مثل علامات OL.

class Parser(HTMLParser):
    def __init__(self, html):
        self.feed(html)

    def handle_starttag(self, tag, attrs):
        parse_method = 'parse_' + tag    
        if hasattr(self, parse_method):  
            getattr(self, parse_method)(attrs)


    def parse_list(self, attrs):
        # generic code

    def parse_header(self, attrs):
       # more generic code

    parse_h1 = parse_h2 = parse_h3 = parse_h4 = parse_h5 = parse_h6 = parse_header
    parse_ol = parse_ul = parse_list

يمكن القيام بذلك باستخدام رمز أقل عاما في handle_starttag الطريقة بلغة مثل Java من خلال تتبع علامات الخريطة إلى نفس الطريقة ولكن بعد ذلك إذا قررت أنك تريد التعامل مع علامات DIV ، يجب عليك إضافة ذلك إلى المنطق الإرسال. هنا فقط تضيف الطريقة parse_div وأنت على ما يرام.

لا تتيح! بطة نوع!

def funtion(arg):
    if hasattr(arg, 'attr1') and hasattr(arg, 'attr2'):
         foo(arg):
    else:
         raise TypeError("arg must have 'attr1' and 'attr2'")

في مقابل isinstance(arg, Foo). يتيح لك هذا المرور في أي كائن attr1 و attr2. يتيح لك ذلك على سبيل المثال تمرير فئة تتبع ملفوفة حول كائن لأغراض تصحيح الأخطاء. سيكون عليك تعديل الفصل للقيام بذلك في Java Afaik.

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

try: 
    foo(arg): 
except (AttributeError, TypeError): 
    raise InvalidArgumentError(foo, arg)

إنه إرم لما إذا كان ينبغي علينا اصطياد AttributeError و TypeError أو فقط دعهم ينتشرون إلى مكان يعرف كيفية التعامل معهم ، لكن هذا مجرد مثال لذلك سنسمح له بالطيران.

نصائح أخرى

"هل الحل الوحيد لكتابة اختبارات لكل طريقة؟"

هل تقول لك لم يكن اكتب اختبارات لكل طريقة في جافا؟

إذا كتبت اختبارات لكل طريقة في Java ، إذن - حسنًا - لا شيء يتغير ، أليس كذلك؟

إعادة تسمية طريقة ، تبدو محفوفة بالمخاطر!

صحيح. لا تفعل ذلك.

إضافة/إزالة المعلمات تبدو مخاطرة جدا!

ماذا؟ هل تتحدث عن معلمات اختيارية؟ إذا كان الأمر كذلك ، فإن وجود أسماء محملة متعددة في جافا يبدو محفوفًا بالمخاطر والمربك. وجود معلمات اختيارية يبدو أبسط.


إذا قمت بالبحث في ذلك عن أسئلة Python الأكثر شيوعًا ، فستجد أن بعض الأشياء هي أسئلة مزمنة.

  • كيفية تحديث PYTHONPATH.

  • لماذا لا يشير بعض حساب النقطة العائمة العشوائية إلى التجريد الرياضي.

  • باستخدام Python 3 ورمز الكتابة من البرنامج التعليمي Python 2.

  • لماذا لا يحتوي Python على معقدة فائقة protected, private و public إعلانات.

  • لماذا لا يوجد لدى بيثون نوع التعداد.

يبدو أن المشكلة المزمنة #1 تستخدم كائنات قابلة للتغيير كقيم افتراضية لوظيفة. ببساطة تجنب هذا.

بعض الأشياء التي أذهلتني عند تجربة Python لأول مرة (قادمة من خلفية Java بشكل أساسي):

  1. يكتب بيثوني الشفرة. استخدم التعبيرات الموصى بها لـ Python ، بدلاً من القيام بذلك بالطريقة القديمة Java/C. هذا هو أكثر من مجرد مشكلة تجميلية أو عقائدية. الرمز البيثوني هو في الواقع أسرع بشكل كبير في الممارسة العملية من الكود الذي يشبه C عمليا في كل وقت. في الواقع ، فإن IMHO الكثير من "Python بطيء" الفكرة التي تطفو حولها ترجع إلى حقيقة أن المبرمجين عديمي الخبرة حاولوا ترميز Java/C في Python وانتهى به الأمر إلى تحقيق نجاح كبير وحصل على فكرة أن Python بطيء بشكل فظيع. استخدم القائمة الشاملات والخريطة/المرشح/تقليلها كلما أمكن ذلك.

  2. احصل على الراحة مع الفكرة القائلة بأن الوظائف هي الأشياء حقًا. مررها كإجراء عمليات الاسترجاعات ، وجعل وظائف إرجاع الوظائف ، والتعرف على الإغلاق وما إلى ذلك.

  3. هناك الكثير من الأشياء الرائعة والسحرية التي يمكنك القيام بها في بيثون مثل أساليب إعادة تسمية كما ذكرت. هذه الأشياء رائعة لإظهار ميزات بيثون ، ولكنها ليست ضرورية حقًا إذا لم تكن بحاجة إليها. في الواقع ، كما أشار S. Lott ، من الأفضل تجنب الأشياء التي تبدو محفوفة بالمخاطر.

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