J'ai ceci :
user_dir: /home/user
user_pics: /home/user/pics
Comment puis-je utiliser le user_dir
pour user_pics ? Si je dois spécifier d'autres propriétés de ce type, ce ne sera pas très pratique.
J'ai ceci :
user_dir: /home/user
user_pics: /home/user/pics
Comment puis-je utiliser le user_dir
pour user_pics ? Si je dois spécifier d'autres propriétés de ce type, ce ne sera pas très pratique.
Je ne comprends pas quel est l'intérêt de ces pointeurs si on ne peut pas les utiliser pour concaténer :/
Il est surprenant, puisque l'objectif des ancres et des références YAML est d'éliminer la duplication des fichiers de données YAML, qu'il n'y ait pas de moyen intégré de concaténer des chaînes de caractères à l'aide de références. Votre cas d'utilisation de la construction d'un nom de chemin à partir de parties est un bon exemple - il doit y avoir de nombreuses utilisations de ce type.
Heureusement, il existe un moyen simple d'ajouter la concaténation de chaînes à YAML via des balises personnalisées en Python.
## in your python code
import yaml
## define custom tag handler
def join(loader, node):
seq = loader.construct_sequence(node)
return ''.join([str(i) for i in seq])
## register the tag handler
yaml.add_constructor('!join', join)
## using your sample data
yaml.load("""
user_dir: &DIR /home/user
user_pics: !join [*DIR, /pics]
""")
Ce qui se traduit par :
{'user_dir': '/home/user', 'user_pics': '/home/user/pics'}
Vous pouvez ajouter d'autres éléments au tableau, comme par exemple " "
o "-"
si les chaînes doivent être délimitées.
Si vous utilisez python avec PyYaml, il est possible de joindre des chaînes de caractères dans le fichier YAML. Malheureusement, il ne s'agit que d'une solution python, et non d'une solution universelle :
con os.path.join
:
user_dir: &home /home/user
user_pics: !!python/object/apply:os.path.join [*home, pics]
con string.join
(par souci d'exhaustivité, cette méthode peut être utilisée pour plusieurs formes de jonction de chaînes :
user_dir: &home /home/user
user_pics: !!python/object/apply:string.join [[*home, pics], /]
Soyez clair sur la signification de cette approche : vous permettez à l'analyseur Pyyaml d'exécuter du code Python arbitraire à partir du fichier d'entrée yaml. C'est un problème de sécurité extrêmement dangereux si vous ne contrôlez pas la source de l'entrée. De nombreux programmes utiliseront la méthode yaml.safe_load()
pour éviter le problème de sécurité. Dans ce cas, votre code ne fonctionnera pas.
Il me semble que YAML lui-même ne définit pas la manière de procéder .
La bonne nouvelle, c'est que le consommateur de YAML pourrait être en mesure de comprendre les variables.
Qu'est-ce qui utilisera votre YAML ?
Mon fichier yaml sert de fichier de configuration. Ce que j'ai collé ci-dessus était juste un exemple, pour illustrer le problème.
@ArnisL. par exemple celui-ci pour définir un chemin d'accès aux répertoires du code source lors de la construction d'un module distinct.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.