为什么PyObjC文档如此糟糕?

17
例如,http://developer.apple.com/cocoa/pyobjc.html仍然适用于OS X 10.4 Tiger而不是10.5 Leopard。这是官方的苹果文档。
官方的PyObjC页面同样糟糕,http://pyobjc.sourceforge.net/ 它非常糟糕,令人困惑。我正在考虑学习Ruby,主要是因为RubyCocoa的东西文档好得多,有很多不错的教程(例如http://www.rubycocoa.com/),以及Shoes GUI工具包。
甚至这个翻译质量不高的日语教程也比我能找到的其他文档更有用。
我只想使用Cocoa GUI创建相对简单的Python应用程序。是否有人可以阐明这些可怕的文档,或者指向一些教程,不只是给你一大堆代码并假设你知道NSThread.detachNewThreadSelector_toTarget_withObject_("queryController", self, None)是什么?

你链接的第一个 PyObjC 教程是由 Jonathan Rentzsch 撰写的文章(你可以在视频中听到他的声音,也可能从 C4 视频中认出他)。尽管它没有署名,但它并不像 Apple 的文档一样是由 Apple 编写和维护的。 - Peter Hosey
9个回答

31

缺乏PyObjC文档的主要原因是只有一个开发人员(我),和大多数开发人员一样,我不特别喜欢写文档。由于PyObjC对我而言只是一个副业项目,所以我倾向于专注于开发功能和修复错误,因为这更有趣。

改进文档的最佳方式是自愿在pyobjc-dev邮件列表上提供帮助。

顺便说一下:pythonmac-sig邮件列表(请参阅Google)是获取有关MacOSX上Python的帮助的绝佳资源(不仅限于PyObjC)。


21

直白地说:

如果您想成为一名有效的Cocoa程序员,您必须学习Objective-C。就这么简单。

无论是Python还是Ruby都不能替代Objective-C通过它们各自的桥接方式。您仍然需要理解Objective-C API、NSObject派生类固有的行为以及Cocoa的许多其他细节。

PyObjC和RubyCocoa是从Cocoa应用程序中访问Python或Ruby功能的绝佳方式,包括在Python或Ruby中构建一个基本上(如果不是完全)使用Cocoa的应用程序。但其中的成功建立在对Cocoa及其所组成的Objective-C API的彻底理解之上。


21

我同意那个教程存在缺陷,直接将随机且未经解释的代码放在你的眼前。它介绍了autorelease pool和user defaults等概念,却没有解释为什么你需要它们("Autorelease pool for memory management"几乎不能算是一个解释)。

话虽如此...

基本上,我想做的就是不用学习ObjC写Cocoa应用程序。

恐怕目前为止,您仍然需要基本掌握ObjC才能从使用Cocoa的任何语言中受益。PyObjC、RubyCocoa、Nu等其他语言最多只能满足一小部分人士需求,而且它们都是由深谙ObjC和Cocoa的人开发的。

目前,您可以看到这些桥梁在脚本语言真正发挥优势的地方最有用,而不是试图使用它们构建整个应用程序。虽然这已经实现了(我正在使用一个由RubyCocoa编写的LimeChat应用程序),但这是罕见的,而且可能会持续一段时间。


7
汤姆和马丁的回应绝对是正确的(在几乎任何开源项目中,您会发现大多数贡献者特别感兴趣的是开发,而不太关心半相关的事项,如文档),但我认为您最后的问题不适合放在PyObjC文档中。
NSThread.detachNewThreadSelector_toTarget_withObject_("queryController", self, None)

NSThread是Cocoa API的一部分,因此在Apple文档中有详细说明,包括特定方法+detachNewThreadSelector:toTarget:withObject:(我会链接到那里,但显然stackoverflow在解析它时存在错误)。CocoaDev wiki 也有一篇文章

我认为PyObjC试图记录Cocoa除了提供如何在Python中使用它的一些基本示例之外,不是一个好主意。解释选择器也可能超出了PyObjC的范围,因为这些也是Objective-C的特性,而不是特定于PyObjC的。


7

5
我想做的就是用Cocoa GUI创建相对简单的Python应用程序。有没有人能解释一下可怕的文档,或者指导我一些不仅给你巨大的代码块并且假设你知道NSThread.detachNewThreadSelector_toTarget_withObject_("queryController", self, None)是什么的教程..?
基本上,我只是想写Cocoa应用程序,而不必学习ObjC。
虽然我基本上同意Soeren的回答,但我会更进一步:
在没有理解Objective C的情况下,您很长时间甚至永远无法使用Cocoa。Cocoa不是独立于Objective C构建的抽象,它明确地与之相关联。您可以在上面引用的示例代码行中看到这一点:
NSThread.detachNewThreadSelector_toTarget_withObject_("queryController", self, None) 

这是用Python编写Objective C代码的方法:

[NSThread detachNewThreadSelector:@selector(queryController:) toTarget:self withObject:nil];

现在需要注意的是,这一行可以从两个角度看待:(1)作为Objective C的一行代码,或者(2)作为Cocoa框架的调用。通过语法,我们将其视为(1)。通过识别NSThread是一个提供一组方便功能的Cocoa框架,我们将其视为(2)。在这种情况下,这个特定的Cocoa框架使得我们很容易让一个对象在新线程上开始执行某些操作。
但问题在于:这里的Cocoa框架(NSThread)以一种明确与框架所编写的语言相关的方式为我们提供了这个方便的服务。也就是说,NSThread给我们提供了一个明确引用“选择器”的功能。事实上,选择器是Objective C如何工作的一项基本内容。
因此,这就是问题所在。Cocoa基本上是Objective-C创建的,其创建者已经考虑到了Objective-C。我并不是说将Cocoa功能接口翻译成对其他语言更自然的形式是不可能的。只是一旦你改变了Cocoa框架,让它不再引用“选择器”,它就不再是真正的Cocoa框架了。它是一个翻译版本。一旦你开始走这条路,我猜想事情会变得非常混乱。你试图跟上苹果更新Cocoa的步伐,也许你会遇到一些无法很好地翻译成新语言的Cocoa部分。因此,像PyObjC这样的东西选择直接暴露Cocoa,以一种非常清晰和简单的相关性方式。正如他们在文档中所说:
为了在Objective-C消息和Python方法之间进行无损和明确的转换,Python方法名等效于带有下划线替换冒号的选择器。
当然,这有点丑陋,而且这意味着你需要了解一些Objective-C,但这是因为另一种选择,如果真的存在,未必更好。

5

我对Objective C或Cocoa一无所知(但对Python有很多了解),但现在我正在使用PyObjc编写一个相当复杂的应用程序。我是如何学习的?我拿起Cocoa Programming for OSX这本书,通过PyObjC阅读整本书(非常快速)。只需忽略关于内存管理的任何内容,你就几乎没什么问题了。唯一的注意点是偶尔需要使用像endSheetMethod这样的装饰器(实际上我认为那是我遇到的唯一一个):

@PyObjcTools.AppHelper.endSheetMethod
def alertEnded_code_context_(self, alert, choice, context):
    pass

3

我很抱歉,这个回答可能不是非常有帮助的,因为作为一名开发者,我讨厌做文档。由于这是一个开源项目,很难找到人来做文档。


3

Tom说的很在理。很多开源项目有专门的开发人员,但很少有人对文档感兴趣。这并没有得到帮助,因为目标可以每天都在变化,这意味着不仅需要创建文档,还要对其进行维护。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接