Как получить несколько свойств одновременно?

Я использую Appscript — интерфейс Python для AppleScript — в моем проекте, который в основном получает данные из приложение для Mac.

Вот пример кода:

    asobj = app('Things').to_dos()[0]
    self.id = asobj.id()
    self.name = asobj.name()
    self.status = asobj.status()

Каждый вызов свойств (идентификатор, имя, статус) вызывает межпроцессный вызов и, следовательно, он медленный ... особенно когда вы делаете то же самое для тысяч объектов.

Есть ли способ получить несколько свойств одновременно через интерфейс AppleScript Python (appscript)?


person Sridhar Ratnakumar    schedule 13.10.2009    source источник


Ответы (2)


Я не уверен на 100%, как это будет выражено в Python, но большинство объектов Applescript поддерживают свойство «свойства», которое возвращает словарь, содержащий пары ключ/значение для каждого из поддерживаемых свойств этого объекта. Я предполагаю, что вызов asobj.properties() вернет соответствующую структуру данных, из которой вы затем сможете получить любые отдельные свойства, которые вы хотите.

person Brian Webster    schedule 13.10.2009
comment
Да, многие приложения с поддержкой сценариев делают это и с помощью Appscript возвращают словарь Python: ››› app(TextEdit.app).properties() {k.class_: k.application, k.version: u'1.6', k. самый передний: False, k.name: u'TextEdit'} - person Ned Deily; 13.10.2009
comment
Спасибо! Выполнение dir(asobj) раньше не помогало. - person Sridhar Ratnakumar; 13.10.2009
comment
Команда dir() в ссылочном объекте Appscript ничего не говорит вам об объекте Applescript в приложении. Ничего не происходит, пока вы не вызовете метод (скажем, .get() или неявно через ()), который заставляет Appscript отправлять события Apple в объект приложения и создавать объект Python на основе возвращенной информации. - person Ned Deily; 13.10.2009

Если у вас большое количество элементов, будет быстрее получить ваши свойства следующим образом:

ref = app('Things').to_dos
ids = ref.id()
names = ref.name()
statuses = ref.status()

а затем используйте функцию Python zip(), чтобы переставить их по мере необходимости. В документации appscript есть глава о методах оптимизации, в которой это объясняется более подробно.

Вы также должны получить копии инструментов ASDictionary и ASTranslate с веб-сайта appscript, если вы еще этого не сделали. ASTranslate поможет вам преобразовать команды приложения из AppleScript в синтаксис appscript. ASDictionary будет экспортировать словари приложений в формате в стиле appscript, а также активирует встроенный в appscript метод help(), позволяющий вам просматривать словари приложений в интерактивном режиме (гораздо более мощный, чем dir()).

person has    schedule 14.10.2009
comment
Индивидуальное получение свойств довольно медленно. - person Sridhar Ratnakumar; 15.10.2009
comment
На самом деле, приведенное выше должно быть намного быстрее, чем запрашивать свойство «свойства» каждого элемента по одному, поскольку в общей сложности он отправляет только три события Apple: одно для получения всех свойств id, одно для получения всех свойств имени, и один, чтобы получить все свойства состояния. Или вы даже можете запросить app('Things').to_dos.properties(), который принимает только одно событие Apple. Это может быть или не быть быстрее, чем отправка трех событий для получения нужных свойств, в зависимости от того, сколько времени потребуется Things и appscript для упаковки и распаковки всех нежелательных свойств. - person has; 20.10.2009