Аргументы метода Python с пробелами

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
514
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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++ и провести с ним какой-то взлом (что может быть сложно!).

+1: имена параметров с пробелами не стоят мучений и не особо помогают. Используйте _ вместо пробелов.

S.Lott 09.12.2008 15:43

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

Kozyarchuk 09.12.2008 16:31

Что плохого в выполнении Allocation (name = "some person", value = 3.2) с одним Allocation на человека?

S.Lott 09.12.2008 17:14

Да, думаю, так и сделаю. Но кажется слишком многословным.

Kozyarchuk 09.12.2008 22:47
Ответ принят как подходящий

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

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

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

Другие вопросы по теме