[Python] Ich habe ein Dienstprogramm erstellt, das wie ein Pfad auf den Diktattyp zugreifen kann

Nachtrag (27.02.2017)

Ich wusste es zum Zeitpunkt des Schreibens noch nicht, aber attrdict ist Don Pisha, wenn Sie nur nach Attributen auf dict zugreifen möchten.

Es kann wie folgt verwendet werden (zitiert aus dem offiziellen Dokument)

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

'bar'

a['foo'] 'bar'


# Überblick und Motivation
 Bei der Verarbeitung einer Web-API-Antwort, die json mit Python zurückgibt.
 Im Allgemeinen ist die Hierarchie tief und es ist schwierig, darauf zu verweisen, während der Wert für jede Hierarchie überprüft wird.
 Daher dachte ich, es wäre nützlich, eine _parse_-Funktion zu haben, die die folgenden Ausführungsergebnisse liefert.

```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")

Es fühlt sich in Bezug auf den Betrieb wie eine Art Abfrageparser an.

Erwägung

――Wenn Sie rekursiv verwenden, können Sie es so wie es ist schnell schreiben ――Ich dachte, es wäre schön, wenn ich es wie ein Pfadformat bezeichnen könnte, aber es geht darum, eine Aufteilung zu schreiben, die den Wörterbuchtyp unterstützt.

Implementierung

Minimale Implementierung.

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

Benennen Sie dparse entsprechend mit einem Bild, das dict parse macht.

Nachtrag

Es sollte verschiedene Lücken geben, also warte ich auf Tsukkomi. Die schnelle Idee ist, dass diese Funktion unterbrochen wird, wenn sie "Keine als Wert" enthält. Es ist eine logische Fehlerquelle, da nicht zwischen "nicht vorhanden" und "Keine als Wert" unterschieden werden kann. Das Wesentliche ist dasselbe, da das Argument default anders als None angegeben wird.

Es kann besser sein, den "nicht existierenden" Fall gehorsam anzusprechen.

Für diejenigen, die dies lesen

Ich denke, dass ein Nutzen dieses Niveaus wahrscheinlich eine Neuerfindung von Rädern ist, daher würde ich gerne wissen, ob es ein gutes Mittel gibt, um diesen Zweck zu erreichen.

Der Code oder das Design ist hässlich, schreiben Sie dies! Wir freuen uns über Ihre Vorschläge.

Ich habe dparse als Funktionsnamen gewählt, weil mir kein passender Name einfiel, aber ich konnte den Namen nicht als Text ausdrücken, wenn ich also eine gute Idee hätte.

Recommended Posts

[Python] Ich habe ein Dienstprogramm erstellt, das wie ein Pfad auf den Diktattyp zugreifen kann
Ich habe ein Paket erstellt, das morphologische Analysegeräte mit Python vergleichen kann
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann
[Python] Ich habe eine Klasse erstellt, die schnell einen Dateibaum schreiben kann
Ich habe ein Modul PyNanaco erstellt, das Nanaco-Guthaben mit Python belasten kann
Ich habe ein Docker-Image erstellt, das FBX SDK Python von Node.js aus aufrufen kann
Ich habe eine VM erstellt, auf der OpenCV für Python ausgeführt wird
Ich habe einen Python-Text gemacht
Ich habe mit Tkinter of Python ein Puzzlespiel (wie) gemacht
Ich habe ein Plug-In erstellt, das "Daruma-san Fell" mit Minecraft ausführen kann
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
[Python] Ich habe einen Line-Bot erstellt, der zufällig nach englischen Wörtern fragt
[Python] Ich habe meine eigene Bibliothek erstellt, die dynamisch importiert werden kann
Ich habe ein Pay-Management-Programm in Python erstellt!
Ich habe mit Python einen Zeichenzähler erstellt
Ich habe einen Gesprächspartner wie Siri gemacht
Ich habe mit Python eine Hex-Map erstellt
Nachdem ich Python3 studiert hatte, machte ich einen Slackbot
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe mit Python einen Neuronensimulator erstellt
Ich habe eine generische Python-Projektvorlage erstellt
Ich habe eine Webanwendung in Python erstellt, die Markdown in HTML konvertiert
Ich habe in Python einen Discord-Bot erstellt, der übersetzt, wenn er reagiert
Ich habe einen einfachen Timer erstellt, der vom Terminal aus gestartet werden kann
Ich habe ein Tool erstellt, das die Dekomprimierung mit CLI (Python3) etwas erleichtert.
[IOS] Ich habe ein Widget erstellt, das den Trend von Qiita in Pythonista3 anzeigt. [Python]
[Python] Ich habe eine Funktion erstellt, die auch reguläre Ausdrücke verwenden kann, die Zeichenfolgen auf einmal ersetzen.
Ich habe eine Python-Wörterbuchdatei für Neocomplete erstellt
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ein Memo, das ich schnell in Python geschrieben habe
Ich habe versucht, eine Klasse zu erstellen, mit der Json in Python problemlos serialisiert werden kann
Ich habe einen Zeilenbot erstellt, der Python verwendet, um ungelesene E-Mails aus Google Mail abzurufen!
Ich möchte eine Prioritätswarteschlange erstellen, die mit Python (2.7) aktualisiert werden kann.
Ich habe PyQCheck, eine Bibliothek, die QuickCheck mit Python ausführen kann, in PyPI registriert.
[Python] Ich habe einen LINE-Bot erstellt, der Gesichter erkennt und Mosaikverarbeitungen durchführt.
In Python habe ich einen LINE-Bot erstellt, der Polleninformationen aus Standortinformationen sendet.
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Ich habe ein Caesar-Kryptografieprogramm in Python erstellt.
Ich habe mit Python ein Bin-Picking-Spiel gemacht
Mattermost Bot mit Python gemacht (+ Flask)
Python Qiita API Wrapper "qiipy" gemacht
[Python / C] Ich habe versucht, ein Gerät zu erstellen, das den Bildschirm eines PCs drahtlos aus der Ferne scrollt.
Ich habe meine eigene Django Middleware erstellt, damit ich von überall auf Anforderungsinformationen zugreifen kann
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
Python, das ich Anfängern in der Programmierung empfehlen möchte
Ich habe einen Anmelde- / Abmeldevorgang mit Python's Bottle durchgeführt.
Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht
Ich habe ein Python-Modul erstellt, um Kommentare zu übersetzen
Ich habe eine Python3-Umgebung unter Ubuntu mit direnv erstellt.
Aus einem Buch, das Programmierer lernen können ... (Python): Zeiger
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
[Python] Ich habe einen Klassifikator für Iris erstellt [Maschinelles Lernen]
Ein Memo, dass ich den Datenspeicher mit Python berührt habe