[Python] J'ai créé un utilitaire qui peut accéder au type dict comme un chemin

Postscript (27/02/2017)

Je ne savais pas au moment de la rédaction, mais attrdict est Don Pisha si vous voulez seulement accéder à dict par attribut.

Il peut être utilisé comme suit (cité du document officiel)

from attrdict import AttrDict
a = AttrDict({'foo': 'bar'})
a.foo

'bar'

a['foo'] 'bar'


# Vue d'ensemble et motivation
 Lors de la gestion d'une réponse d'API Web qui renvoie json avec python.
 Généralement, la hiérarchie est profonde et il est difficile de s'y référer tout en vérifiant la valeur de chaque hiérarchie.
 Donc, j'ai pensé qu'il serait utile d'avoir une fonction _parse_ qui donnerait les résultats d'exécution suivants.

```python
some_dict = {
	"path":{
		"to":{
			"target": 
				"key": 1 }}}

# expected return: 1
parse(some_dict, "/path/to/target/key")

# expected return: None
parse(some_dict, "/fake/key")

Cela ressemble à une sorte d'analyseur de requêtes en termes de fonctionnement.

Considération

――Si vous utilisez récursif, vous pouvez l'écrire rapidement tel quel ――Je pensais que ce serait bien si je pouvais y faire référence comme un format de chemin, mais le but est d'écrire une division qui prend en charge le type de dictionnaire.

la mise en oeuvre

Implémentation minimale.

d = {
	'a': 1,
	'b': [1, 2, 3],
	'c': {
		'ca': 1,	
		'cb': [2, 3, 4] }}

d2 = {
	'a': 1,
	'a/x': 2,
	'b': {
		'ba': 100 }}

def dparse(dic, p, sep="/", default=None):
	lis = p.split(sep)
	def _(dic, lis, sep, default):
		if len(lis) == 0:
			return default
		if len(lis) == 1:
			return dic.get(lis[0], default)
		else:
			return _(dic.get(lis[0], {}), lis[1:], sep, default)
	return _(dic, lis, sep=sep, default=None)

if __name__=="__main__":
	print dparse(d, "a") # 1
	print dparse(d, "c/cb") # [2, 3, 4]
	print dparse(d2, "a/x", sep=":") # 2
	print dparse(d2, "b:ba", sep=":") # 100

Nommez dparse de manière appropriée avec une image qui rend dict parse.

Postscript

Il devrait y avoir plusieurs failles, alors j'attends Tsukkomi. L'idée rapide est que cette fonction sera interrompue si elle contient "Aucun comme valeur". Il s'agit d'une source d'erreur logique car «Aucune en tant que valeur» ne peut être distinguée de «n'existe pas». L'essence est la même car l'argument default est spécifié autrement que None.

Il peut être préférable de soulever docilement le cas «inexistant».

À ceux qui lisent ceci

Je pense qu'une utilité de ce niveau est probablement une réinvention des roues, alors j'aimerais savoir s'il existe un bon moyen pour atteindre cet objectif.

Le code ou la conception est moche, écrivez ceci! Nous apprécions vos suggestions.

J'ai choisi dparse pour le nom de la fonction parce que je ne pouvais pas penser à un nom approprié, mais je ne pouvais pas exprimer le nom donc si j'avais une bonne idée.

Recommended Posts

[Python] J'ai créé un utilitaire qui peut accéder au type dict comme un chemin
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
[python] J'ai créé une classe qui peut écrire rapidement une arborescence de fichiers
J'ai fait un module PyNanaco qui peut charger des crédits nanaco avec python
J'ai créé une image Docker qui peut appeler FBX SDK Python à partir de Node.js
J'ai créé une VM qui exécute OpenCV pour Python
J'ai fait un texte Python
J'ai fait un jeu de puzzle (comme) avec Tkinter of Python
J'ai créé un plug-in qui peut faire "Daruma-san tombé" avec Minecraft
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
[Python] J'ai créé ma propre bibliothèque qui peut être importée dynamiquement
J'ai fait un programme de gestion de la paie en Python!
J'ai fait un compteur de caractères avec Python
J'ai fait un interlocuteur comme Siri
J'ai fait une carte hexadécimale avec Python
Après avoir étudié Python3, j'ai créé un Slackbot
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait un simulateur de neurones avec Python
J'ai créé un modèle de projet Python générique
J'ai créé une application Web en Python qui convertit Markdown en HTML
J'ai créé un bot Discord en Python qui se traduit quand il réagit
J'ai fait une simple minuterie qui peut être démarrée depuis le terminal
J'ai créé un outil qui facilite un peu la décompression avec CLI (Python3)
[IOS] J'ai créé un widget qui affiche la tendance de Qiita dans Pythonista3. [Python]
[Python] J'ai créé une fonction qui peut également utiliser des expressions régulières qui remplacent toutes les chaînes de caractères à la fois.
J'ai créé un fichier de dictionnaire python pour Neocomplete
J'ai fait une prévision météo de type bot avec Python.
Un mémo que j'ai écrit un tri rapide en Python
J'ai essayé de créer une classe qui peut facilement sérialiser Json en Python
J'ai créé un Line Bot qui utilise Python pour récupérer les e-mails non lus de Gmail!
Je souhaite créer une file d'attente prioritaire pouvant être mise à jour avec Python (2.7)
J'ai enregistré PyQCheck, une bibliothèque qui peut effectuer QuickCheck avec Python, dans PyPI.
[Python] J'ai créé un LINE Bot qui détecte les visages et effectue le traitement de la mosaïque.
En Python, j'ai créé un LINE Bot qui envoie des informations sur le pollen à partir des informations de localisation.
Une histoire à laquelle j'étais accro après la communication SFTP avec python
J'ai créé un programme cryptographique César en Python.
J'ai fait un jeu de cueillette avec Python
Made Mattermost Bot avec Python (+ Flask)
Création du wrapper d'API Qiita Python "qiipy"
[Python / C] J'ai créé un appareil qui fait défiler sans fil l'écran d'un PC à distance.
J'ai créé mon propre middleware Django afin de pouvoir accéder aux informations de demande de n'importe où
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
Python que je voudrais recommander aux débutants en programmation
J'ai effectué un processus de connexion / déconnexion en utilisant Python's Bottle.
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai créé un module Python pour traduire les commentaires
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
D'un livre que les programmeurs peuvent apprendre ... (Python): Pointer
J'ai essayé de faire LINE BOT avec Python et Heroku
[Python] J'ai créé un classificateur pour les iris [Machine learning]
Un mémo que j'ai touché au magasin de données avec python