Аргументы метода Python с пробелами - PullRequest
1 голос
/ 09 декабря 2008

Я хотел бы создать простой формат файла / 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?

Ответы [ 4 ]

3 голосов
/ 09 декабря 2008

Я полагаю, что был бы какой-то способ сделать это. Но я чувствую себя вынужденным спросить, действительно ли достаточно большая разница в удобочитаемости от этого

Allocation(Param1 = Val1, Param2 = Val2 )

К этому:

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

, чтобы изменить это? Я уверен, что есть способ сделать то, что вы хотите сделать, но я в первую очередь обеспокоен, если затраченные усилия окупятся.

Моя цель - предоставить DSL, который можно использовать для ввода данных в систему. В приведенном выше сценарии параметры будут именами людей, а значения - процентами.

Теперь я лучше понимаю, что вы хотите сделать, но я все же думаю, что вам, возможно, придется пожертвовать некоторой читабельностью, чтобы получить то, что вы хотите. Лично я бы пошел с чем-то вроде:

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

Если это не то, с чем вы можете пойти, то вы можете пересмотреть вопрос о том, хотите ли вы использовать Python для DSL или использовать что-то домашнее. Разрешение пробелов допускает слишком много неоднозначностей для большинства языков программирования, чтобы это разрешать.

Если вы все еще хотите продолжить работу с использованием python, вы можете рассмотреть возможность публикации в C-API SIG ( SIGS ) или, возможно, python-dev list (как в крайнем случае). Единственный способ сделать это - встроить интерпретатор python в программу на C / C ++ и выполнить какой-то взлом (что может быть сложно!).

1 голос
/ 09 декабря 2008

Вот мои предпочтения.

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

Это относительно простые объявления классов для создания. Полученная структура также приятна для обработки.

1 голос
/ 09 декабря 2008

Если я не ошибаюсь в вашей основной предпосылке, ничто не мешает вам написать класс, который анализирует ваш собственный синтаксис, а затем использовать этот собственный синтаксис в виде строки с одним аргументом:

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

В этом примере точки с запятой действуют как разделители пары имя-значение, а equals представляет разделитель имя-значение. Более того, вы можете легко настроить свой синтаксический анализатор на прием пользовательских разделителей как части конструктора объекта.

Если писать синтаксический анализатор кажется слишком сложным, учтите, что (для такого синтаксиса) вы можете получить свои значения, просто разбив строку на

/\s*;\s*/

и затем на

/\s*=\s*/

для быстрого получения пар имя-значение. У вас также есть возможность выбрать любой из нескольких парсеров аргументов, уже написанных для Python.

По общему признанию, это не использует Python в качестве парсера аргументов, что является соображением, которое вы должны будете сбалансировать с простотой такого подхода.

0 голосов
/ 09 декабря 2008

Вы можете сделать это:

def Allocation(**kwargs):
    print kwargs

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

Edit: Ваше редактирование теперь включает мой ответ, так что нет, проще не было бы пробелов в аргументах ключевых слов.

...