Используйте reduce()
для перемещения словаря:
from functools import reduce # forward compatibility for Python 3
import operator
def getFromDict(dataDict, mapList):
return reduce(operator.getitem, mapList, dataDict)
и повторного использования getFromDict
, чтобы найти местоположение для сохранения значения для setInDict()
:
def setInDict(dataDict, mapList, value):
getFromDict(dataDict, mapList[:-1])[mapList[-1]] = value
Все, кроме последнего элемента в mapList
, необходимы, чтобы найти «родительский» словарь, чтобы добавить значение, а затем использовать последний элемент, чтобы установить значение в правую клавишу.
Демо:
>>> getFromDict(dataDict, ["a", "r"])
1
>>> getFromDict(dataDict, ["b", "v", "y"])
2
>>> setInDict(dataDict, ["b", "v", "w"], 4)
>>> import pprint
>>> pprint.pprint(dataDict)
{'a': {'r': 1, 's': 2, 't': 3},
'b': {'u': 1, 'v': {'w': 4, 'x': 1, 'y': 2, 'z': 3}, 'w': 3}}
Обратите внимание, что руководство по стилю Python PEP8 предписывает имена змеиных имен для функций . Вышеупомянутое работает одинаково хорошо для списков или комбинации словарей и списков, поэтому имена должны быть действительно get_by_path()
и set_by_path()
:
from functools import reduce # forward compatibility for Python 3
import operator
def get_by_path(root, items):
"""Access a nested object in root by item sequence."""
return reduce(operator.getitem, items, root)
def set_by_path(root, items, value):
"""Set a value in a nested object in root by item sequence."""
get_by_path(root, items[:-1])[items[-1]] = value
Если два приложения регистрируют одну и ту же настраиваемую схему URL-адресов, не определено, какое приложение действительно будет запущено. Один из них будет запущен, но нет никакого способа узнать.
Вот настоящий кикер. Если у вас есть два приложения на вашем устройстве с одинаковой схемой URL-адресов, и вы удаляете тот, который действительно запускается, другой не будет запускаться по URL-адресу без перезагрузки устройства iOS.
Ваше лучшее решение заключается в том, чтобы ваша пользовательская схема URL-адресов не была тривиальной, поэтому мало шансов, что у другого приложения будет та же схема.
Политика Apple изменилась с 2012 года. Сегодня они указывают, что несколько приложений не смогут регистрироваться для одной и той же схемы . Время регистрации - это гораздо более чистое место для решения конфликтов, чем время выполнения, поскольку оно позволяет избежать проблем безопасности, обсужденных с другими ответами.
Примечание. Если для обработки одной и той же схемы URL регистрируется несколько сторонних приложений, в настоящее время нет процесса определения того, какое приложение будет присвоено этой схеме.
blockquote >
Из документов Apple:
Реализация пользовательских схем URL
У меня нет ответа на оставшуюся часть вашего вопроса (в это время по крайней мере).
EDIT:
Согласно яблочным документам:
Примечание. Если несколько сторонних приложений регистрируются для обработки одной и той же схемы URL, не определено, какое из приложений выбрано для обработки URL-адресов этого типа.
(О, извините rmaddy, не видел ваш ответ до: P)