Question

Je voudrais créer un format de fichier simple / DSL qui permettrait à mes utilisateurs de saisir des données. Mon système est en python et utiliser l’analyseur de python est attrayant. Syntaxe comme celle-ci pour définir un élément de données semble très pratique.

Allocation(Param1 = Val1, Param2 = Val2 )

Cependant, il ne prend pas en charge les noms de paramètres avec des espaces.

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

Les versions conviviales pour l’analyseur Python peuvent se présenter comme suit, mais pas très conviviales.

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

Y a-t-il un moyen de rendre cela plus lisible en python?

Était-ce utile?

La solution

Voici mes préférences.

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

Ce sont des déclarations de classe relativement faciles à créer. La structure résultante est également agréable à traiter.

Autres conseils

J'imagine qu'il y aurait un moyen de le faire. Mais je me sens obligé de poser la question suivante: existe-t-il vraiment une assez grande différence de lisibilité entre ce

Allocation(Param1 = Val1, Param2 = Val2 )

À ceci:

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

faire une grande différence? Je suis sûr qu'il existe un moyen de faire ce que vous voulez faire, mais ma première préoccupation est de savoir si les efforts nécessaires en valent la peine.

  

Mon objectif est de fournir un DSL pouvant être utilisé pour la saisie de données dans le système. Dans le scénario ci-dessus, les paramètres seraient les noms des personnes et les valeurs, les pourcentages.

Je comprends mieux ce que vous voulez faire maintenant, mais je pense toujours que vous pourriez devoir renoncer à une certaine lisibilité pour obtenir ce que vous voulez. Personnellement, je choisirais quelque chose comme:

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

Si ce n'est pas quelque chose que vous pouvez utiliser, vous voudrez peut-être reconsidérer si vous souhaitez utiliser Python pour votre DSL ou opter pour quelque chose que vous avez développé chez vous. Autoriser les espaces permet trop d'ambiguïtés à la plupart des langages de programmation pour le permettre.

Si vous souhaitez toujours poursuivre avec l’utilisation de python, vous pouvez envisager de publier sur le SIG C-API ( SIGS ) ou peut-être la liste python-dev (en dernier recours). La seule façon pour moi de faire cela serait d’intégrer l’interprète Python dans un programme C / C ++ et de faire une sorte de piratage informatique (ce qui peut être difficile!).

À moins que je ne prenne ici pour base votre principe de base, rien ne vous empêche d'écrire une classe qui analyse votre propre syntaxe personnalisée, puis d'utiliser cette syntaxe personnalisée comme chaîne à un seul argument:

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

Dans cet exemple, les points-virgules agissent comme des séparateurs nom-paire-paire et equals représente le séparateur nom-valeur. De plus, vous pouvez facilement configurer votre analyseur pour accepter les délimiteurs personnalisés dans le constructeur d’objets.

Si l'écriture d'un analyseur semble trop ardue, considérez que (pour une syntaxe telle que celle-ci), vous pouvez obtenir vos valeurs en séparant simplement la chaîne

.
/\s*;\s*/

puis sur

/\s*=\s*/

pour obtenir rapidement les paires nom-valeur. Vous avez également la possibilité de choisir l’un des analyseurs d’argument déjà écrits pour Python.

Certes, cela n’utilise pas Python comme analyseur d’argument, c’est une considération à prendre en compte par rapport à la simplicité d’une telle approche.

Vous pouvez faire ceci:

def Allocation(**kwargs):
    print kwargs

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

Modifier: Votre modification inclut maintenant ma réponse, alors non, il n’existe pas de moyen plus simple d’avoir des espaces dans les arguments de mots clés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top