سؤال

أرغب في إنشاء تنسيق ملف/DSL بسيط يسمح للمستخدمين بإدخال البيانات.نظامي موجود في لغة بايثون واستخدام محلل بايثون أمر جذاب.يبدو بناء الجملة هذا مناسبًا جدًا لتعريف عنصر البيانات.

Allocation(Param1 = Val1, Param2 = Val2 )

ومع ذلك، فهو لا يدعم الأسماء المعلمة ذات المسافات.

Allocation(Param 1 = Val1, Param 2 = Val2 )

يمكن أن تبدو الإصدارات سهلة الاستخدام لمحلل Python كما يلي، ولكنها ليست سهلة الاستخدام للغاية.

Allocation(("Param 1",Val1), ("Param 2",Val1) )
Allocation(**{"Param 1":Val1, "Param 2":Val1} )

هل هناك طريقة لجعل هذا أكثر قابلية للقراءة في بيثون؟

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

المحلول

إليك أفضله.

AllocationSet(
    Alloc( name="some name", value=1.23 ),
    Alloc( name="another name", value=2.34 ),
    Alloc( name="yet another name", value=4.56 ),
)

وهذه هي الإعلانات الدرجة سهلة نسبيا لإنشاء. هيكل الناتج هو لطيف لعملية أيضا.

نصائح أخرى

وأتصور أنه لن يكون هناك طريقة للقيام بذلك. ولكن أجد نفسي مضطرا أن نسأل، هل هناك حقا فرق كبيرة بما يكفي في القراءة من هذا

Allocation(Param1 = Val1, Param2 = Val2 )

لهذا:

Allocation(Param 1 = Val1, Param 2 = Val2 )

ولجعل هذا فرق كبير؟ أنا متأكد من أن هناك وسيلة لتفعل ما تريد القيام به، ولكن شاغلي الأول هو إذا كان الجهد المبذول سوف يكون من المفيد النتيجة.

<اقتباس فقرة>   

وهدفي هو تقديم DSL والتي يمكن استخدامها لإدخال البيانات في النظام. في السيناريو أعلاه، فإن بارامس تكون أسماء الناس، وسوف تكون قيم النسب المئوية.

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

Allocation(
    { 'name1' : value1,
      'name1' : value2, }
)

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

إذا كنت لا تزال ترغب في متابعة هذه باستخدام بيثون، قد ترغب في النظر في نشر إلى SIG C-API (<لأ href = "http://www.python.org/community/sigs/" يختلط = " نوفولو noreferrer "> سغس ) أو ربما قائمة بيثون ديف (كملاذ أخير). إن الطريقة الوحيدة التي أستطيع أن أرى لذلك أن يكون لتضمين مترجم الثعبان في برنامج C / C ++ والقيام ببعض النوع من القرصنة معها (والتي يمكن أن يكون صعبا!).

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

Allocation("Param 1=Check Up; Param 2=Mean Value Theorem;")

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

وإذا كان يبدو صعبا للغاية لكتابة محلل، نعتبر أن (لتركيب مثل هذا) هل يمكن الحصول على القيم الخاصة بك ببساطة عن طريق تقسيم سلسلة على

/\s*;\s*/

ومن ثم

/\s*=\s*/

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

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

انت تستطيع فعل ذالك:

def Allocation(**kwargs):
    print kwargs

myargs = {"Param 1":Val1, "Param 2":Val1}
Allocation(**myargs)

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

scroll top