Я хотел бы создать простой формат файла / DSL, который позволил бы моим пользователям вводить данные. Моя система находится на Python, и использование синтаксического анализатора Python является привлекательным. Подобный синтаксис для определения элемента данных кажется довольно удобным.
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} )
Есть ли способ сделать это более читаемым в Python?






Ты можешь сделать это:
def Allocation(**kwargs):
print kwargs
myargs = {"Param 1":Val1, "Param 2":Val1}
Allocation(**myargs)
Редактировать: Теперь ваша редакция включает мой ответ, поэтому нет более простого способа использовать пробелы в аргументах ключевых слов.
Если я не ошибаюсь здесь в вашей основной посылке, ничто не мешает вам написать класс, который анализирует ваш собственный синтаксис, а затем использовать этот настраиваемый синтаксис как строку с одним аргументом:
Allocation("Param 1=Check Up; Param 2=Mean Value Theorem;")
В этом примере точки с запятой действуют как разделители пар имя-значение, а равно представляет собой разделитель имени-значения. Более того, вы можете легко настроить свой синтаксический анализатор, чтобы он принимал настраиваемые разделители как часть конструктора объекта.
Если писать синтаксический анализатор кажется слишком сложным, учтите, что (для такого синтаксиса, как этот) вы можете получить свои значения, просто разделив строку на
/\s*;\s*/
а затем на
/\s*=\s*/
чтобы быстро получить пары имя-значение. У вас также есть возможность выбрать любой из нескольких анализаторов аргументов, уже написанных для Python.
По общему признанию, это не использует Python в качестве парсера аргументов, что является соображением, которое вам придется уравновесить с простотой такого подхода, как этот.
Я предполагаю, что есть способ сделать это. Но я вынужден спросить, действительно ли существует достаточно большая разница в удобочитаемости по сравнению с этим?
Allocation(Param1 = Val1, Param2 = Val2 )
К этому:
Allocation(Param 1 = Val1, Param 2 = Val2 )
чтобы иметь такое большое значение? Я уверен, что есть способ делать то, что вы хотите, но меня прежде всего беспокоит, стоит ли затраченные усилия на результат.
my goal is to provide a DSL which can be used for data entry into the system. In the above scenario, params would be people names and values would be percentages.
Я лучше понимаю, что вы хотите делать сейчас, но все же думаю, что вам, возможно, придется пожертвовать некоторой удобочитаемостью, чтобы получить то, что вы хотите. Лично я бы сказал что-то вроде:
Allocation(
{ 'name1' : value1,
'name1' : value2, }
)
Если это не то, с чем вы можете пойти, тогда вы можете пересмотреть, хотите ли вы использовать Python для своего DSL или использовать что-то самодельное. Разрешение пробелов допускает слишком много двусмысленностей для большинства языков программирования.
Если вы все еще хотите добиться этого с помощью python, вы можете рассмотреть возможность публикации в C-API SIG (SIGS) или, возможно, список python-dev (в крайнем случае). Единственный способ, который я вижу для этого, - это встроить интерпретатор python в программу C / C++ и провести с ним какой-то взлом (что может быть сложно!).
Моя цель - предоставить DSL, который можно использовать для ввода данных в систему. В приведенном выше сценарии параметрами будут имена людей, а значениями - проценты.
Что плохого в выполнении Allocation (name = "some person", value = 3.2) с одним Allocation на человека?
Да, думаю, так и сделаю. Но кажется слишком многословным.
Вот мои предпочтения.
AllocationSet(
Alloc( name = "some name", value=1.23 ),
Alloc( name = "another name", value=2.34 ),
Alloc( name = "yet another name", value=4.56 ),
)
Это относительно простые для создания объявления классов. Полученная структура тоже приятна в обработке.
+1: имена параметров с пробелами не стоят мучений и не особо помогают. Используйте _ вместо пробелов.