Python 如何同时获取多个属性?

Python 如何同时获取多个属性?,python,macos,sourceforge-appscript,py-appscript,Python,Macos,Sourceforge Appscript,Py Appscript,我在我的一个项目中使用了AppleScript的Python接口,它基本上从中获取数据 下面是一个示例代码: asobj = app('Things').to_dos()[0] self.id = asobj.id() self.name = asobj.name() self.status = asobj.status() 每次对属性(id、名称、状态)的调用都会进行进程间调用,因此速度很慢。。尤其是当你们对成千上万的对象做同样的事情时 有没有一种方法可以通过

我在我的一个项目中使用了AppleScript的Python接口,它基本上从中获取数据

下面是一个示例代码:

    asobj = app('Things').to_dos()[0]
    self.id = asobj.id()
    self.name = asobj.name()
    self.status = asobj.status()
每次对属性(id、名称、状态)的调用都会进行进程间调用,因此速度很慢。。尤其是当你们对成千上万的对象做同样的事情时


有没有一种方法可以通过AppleScript的Python接口(appscript)同时获取多个属性?

我不能100%确定这在Python中是如何表达的,但大多数AppleScript对象都支持一个“properties”属性,该属性将返回一个字典,其中包含该对象的每个受支持属性的键/值对。我猜调用
asobj.properties()
将返回一个适当的数据结构,然后您可以从中检索任何您想要的单个属性。

如果您有大量元素,那么像这样获取属性会更快:

ref = app('Things').to_dos
ids = ref.id()
names = ref.name()
statuses = ref.status()
然后使用Python的zip()函数根据需要重新排列它们。appscript文档中有一章介绍了优化技术,详细说明了这一点


如果您还没有从appscript网站获取ASDictionary和ASTranslate工具的副本,那么您也应该从appscript网站获取这些工具的副本。ASTranslate将帮助您将应用程序命令从AppleScript转换为appscript语法。ASDictionary将以appscript样式的格式导出应用程序字典,并启用appscript的内置help()方法,允许您以交互方式浏览应用程序字典(比dir()强大得多)。

是的,许多可编写脚本的应用程序都会这样做,并且使用appscript返回Python字典:>>>app(“TextEdit.app”).properties(){k.class\:k.application,k.version:u'1.6',k.frontmost:False,k.name:u'TextEdit'}谢谢!执行
dir(asobj)
之前没有帮助。Appscript引用对象上的dir()不会告诉您应用程序中的Applescript对象的任何信息。除非调用一个方法(例如,.get()或隐式via()),该方法会导致Appscript将Apple事件发送到应用程序对象,并根据返回的信息构造Python对象,否则不会发生任何事情。单独获取属性非常慢。实际上,上述操作应该比一次只请求一个元素的“属性”属性快得多,因为它总共只发送三个Apple事件:一个获取所有id属性,一个获取所有名称属性,一个获取所有状态属性。或者,您甚至可以请求app('Things').to_dos.properties(),这只需要一个苹果事件。这可能比发送三个事件来获取所需属性快,也可能不快,这取决于Things和appscript打包和解包所有不需要的属性所需的时间。