Pergunta

Eu gostaria de criar um formato de arquivo simples / DSL que permitiria que meus usuários para os dados de entrada. Meu sistema é em python e analisador usando do python é atraente. Sintaxe como esta para a definição de um elemento de dados parece bastante conveniente.

Allocation(Param1 = Val1, Param2 = Val2 )

No entanto, ele não suporta nomes param com espaços.

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

Python analisador versões amigáveis ??pode olhar como se segue, mas não muito amigável.

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

Existe uma maneira de fazer isso mais legível em python?

Foi útil?

Solução

Aqui está a minha preferência.

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

Estas são declarações de classe relativamente fácil criar. A estrutura resultante é agradável ao processo, também.

Outras dicas

Eu imagino que haveria alguma maneira de fazê-lo. Mas sinto-me compelido a perguntar: existe realmente uma diferença bastante grande na leitura deste

Allocation(Param1 = Val1, Param2 = Val2 )

Para isto:

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

para fazer a diferença um grande? Eu tenho certeza que há uma maneira de fazer o que você quer fazer, mas a minha primeira preocupação é se o esforço envolvido valeria a pena o resultado.

meu objetivo é fornecer uma DSL que pode ser usado para entrada de dados no sistema. No cenário acima, params seria os nomes das pessoas e valores seria percentuais.

Eu tenho uma melhor compreensão do que você quer fazer agora, mas eu ainda acho que você pode acabar tendo que sacrificar alguma leitura para obter o que deseja. Pessoalmente, eu iria com algo como:

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

Se isso não é algo que você pode ir com, então você pode querer reconsiderar se você quiser usar Python para o seu DSL ou ir com algo home-grown. Permitindo espaços em branco permite que muitas ambiguidades para a maioria das linguagens de programação para permitir que ele.

Se você ainda deseja prosseguir este com o uso de python, você pode querer considerar a postagem para o SIG C-API ( SIGS ) ou talvez o href="http://mail.python.org/mailman/listinfo/python-dev" rel="nofollow noreferrer"> lista (como último recurso). A única maneira que eu posso ver de fazer isso seria a de incorporar o interpretador Python em um programa C / C ++ e fazer algum tipo de cortar com ele (que pode ser difícil!).

A menos que eu estou confundindo sua premissa básica aqui, não há nada para impedi-lo de escrever uma classe que analisa a sua própria sintaxe de costume, e depois usar essa sintaxe de costume como uma string de argumento único:

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

Neste exemplo, ponto e vírgula agir como os separadores de nome-valor-par, e iguala representa o separador de nome-valor. Além disso, você pode facilmente configurar o analisador para aceitar delimitadores personalizados como parte do construtor do objeto.

Se parece demasiado assustadora para escrever um parser, considere que (para uma sintaxe como esta), você pode obter seus valores, simplesmente dividindo a string em

/\s*;\s*/

e depois em

/\s*=\s*/

para obter rapidamente os pares nome-valor. Você também tem a opção de escolher entre qualquer um dos vários analisadores argumento já escritos para Python.

Evidentemente, este não usar Python como o analisador de argumento, que é uma consideração que você terá de equilibrar contra a simplicidade de uma abordagem como esta.

Você pode fazer isso:

def Allocation(**kwargs):
    print kwargs

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

Editar: Sua edição inclui agora a minha resposta assim não, não há nenhuma maneira mais fácil de ter espaços em argumentos de palavra-chave.

scroll top