سؤال

أنا تحليل ملف مع بيثون و pyparsing. (إنه ملف التقرير ل مرض في ماتلاب ولكن هذا ليس مهما). هنا هو ما لدي حتى الآن. أعتقد أنها فوضى وترغب في بعض النصائح حول كيفية تحسينه. على وجه التحديد، كيف يجب أن أقوم بتنظيم تعريفات القواعد الخاصة بي مع البخيبات؟

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

يجب أن أضع كل رمز الإدخال والإخراج في ملف منفصل إلى وظائف الطبقة الأخرى؟ من شأنه أن يجعل الغرض من الفصل أكثر وضوحا.

أنا مهتم أيضا بمعرفة ما إذا كانت هناك طريقة أسهل لتحليل ملف، قم ببعض عمليات التحقق من الحرمان وتخزين البيانات في الفصل. يبدو أنني أقضي الكثير من وقتي في القيام بذلك.

(سأقبل إجابات انها جيدة بما فيه الكفاية أو استخدام س بدلا من النباط إذا كان الناس يتفقون)

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

المحلول

يمكن أن أذهب في كلتا الحالتين باستخدام طريقة كبيرة واحدة لإنشاء المحلل المحركي الخاص بك مقابل أخذها في خطوات بالطريقة التي لديك الآن.

أستطيع أن أرى أنك حددت بعض الأدوات المساعدة المساعد المفيدة، مثل الشق ("قمع حرفية"، أفترض)، StringTolits، والتحتيم. هذا يبدو جيدا بالنسبة لي.

أحب أن تستخدم أسماء النتائج، فإنها تعمل حقا على تحسين متانة شفرة تحليلك. أود أن أوصي باستخدام نموذج الاختصار الذي تمت إضافته في pyparing 1.4.7، حيث يمكنك استبداله

busname.setResultsName("bus1")

مع

busname("bus1")

هذا يمكن أن يذكر رمزك قليلا جدا.

أود أن أنظر إلى الوراء من خلال تصرفات تحليلك لمعرفة المكان الذي تستخدم فيه فهارس رقمية للوصول إلى الرموز الفردية، والعودة وتعيين أسماء النتائج بدلا من ذلك. هنا حالة واحدة، حيث يعود GetStats (ngroup + sgroup).setParseAction(self.process_stats). وبعد Process_Stats لديه مراجع مثل:

self.num_load = tokens[0]["loads"]
self.num_generator = tokens[0]["generators"]
self.num_transformer = tokens[0]["transformers"]
self.num_line = tokens[0]["lines"]
self.num_bus = tokens[0]["buses"]
self.power_rate = tokens[1]["rate"]

أحب أن لديك مجموعة كبيرة والقيم الإحصائيات، ولكن المضي قدما وإعطاء الأسماء، مثل "الشبكة" و "soln". ثم يمكنك كتابة رمز التحليل هذا ك (لقد تم تحويلها أيضا إلى تدوين سمة كائن أسهل للقراءة بدلا من تدوين عنصر DICT):

self.num_load = tokens.network.loads
self.num_generator = tokens.network.generators
self.num_transformer = tokens.network.transformers
self.num_line = tokens.network.lines
self.num_bus = tokens.network.buses
self.power_rate = tokens.soln.rate

أيضا، سؤال أسلوب: لماذا تستخدم في بعض الأحيان الصريح والبناء، بدلا من استخدام المشغل "+"؟

busdef = And([busname.setResultsName("bus1"),
            busname.setResultsName("bus2"),
            integer.setResultsName("linenum"),
            decimaltable("pf qf pl ql".split())])

هذا هو مجرد مكتوب بسهولة:

busdef = (busname("bus1") + busname("bus2") + 
            integer("linenum") + 
            decimaltable("pf qf pl ql".split()))

بشكل عام، أعتقد أن هذا يدور حول ملف من هذا التعقيد. لدي تنسيق مماثل (خاصة، لسوء الحظ، لذلك لا يمكن مشاركتها) التي قمت ببناء الرمز في القطع المشابهة للطريقة التي لديك، ولكن بطريقة واحدة كبيرة، شيء مثل هذا:

def parser():
    header = Group(...)
    inputsummary = Group(...)
    jobstats = Group(...)
    measurements = Group(...)
    return header("hdr") + inputsummary("inputs") + jobstats("stats") + measurements("meas")

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

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