[Pyobjc-dev] Re: [Pythonmac-SIG] pyobjc / cocoa

Ronald Oussoren oussoren@cistron.nl
Thu, 17 Oct 2002 22:29:38 +0200


On Thursday, Oct 17, 2002, at 22:06 Europe/Amsterdam, Jack Jansen wrote:

>
> On donderdag, oktober 17, 2002, at 06:24 , Bill Bumgarner wrote:
>> Convenience wrappers are in the works.  Instead of wrapping, we are 
>> thinking of simply providing a subclass of NSDictionary and NSArray 
>> that can encapsulate DictType and Array/TupleTypes respectively.
The (Objective-C) class 'OC_PythonObject' already exposes the Python 
C-API to Objective-C. It would be easy to make the interface for 
collections more like the Foundation interfaces.

There is one thing that we should keep in mind: the documentation for 
Foundation mentions that most NS<Collection> classes are binary 
compatible with CF<Collection> types (Apple uses a fancy term like 
'zero-cost bridging', they mean you can cast an NS<Collection>* to a 
CF<Collection>* and back).

I've thought about adding a mechanism that automaticly converts 
Carbon.CF.CF<Collection> instances to Objective-C objects. This is 
pretty ease, but I do not have time to do this at the moment.

>> That way, Python arrays and dicts will behave like normal NSArray / 
>> NSDictionary instances on the ObjC side of the bridge.   (The other 
>> direction has already been bridged).
>
> I think we should again combine forces here.
<nod>

> At the moment we have two bridges that make the NS-objects or the 
> CoreFoundation alter-ego's available to Python, and half a bridge the 
> other way.

>
> The Carbon.CF module (a misnomer, it isn't Carbon-dependent, that'll 
> be fixed) exports most of CoreFoundation's objects to Python, but at 
> the moment it isn't complete in that you can't say obj[12] if obj as a 
> CFArray, i.e. it just exports method calls. It does have a nifty 
> toCF() method that takes any supported Python object (a recursive 
> combination of dict/list/string/scalar/CFObject) and returns its CF 
> equivalent, and each CFObject has a toPython() method that does the 
> reverse. And due to the way Carbon.CF works you hardly ever have to 
> call toCF(), usually if a conversion from a Python object is needed it 
> is done automatically.
Given the equivalence of lots of NS<X> classes with CF<X> types the 
toCF() function could easily be used to implement a toObjC() function.

>
> And in PyObjC we have support for using NS objects in a way that is 
> natural to Python, i.e. you can say obj[12] here. But when I last 
> looked PyObjC didn't handle all object types, and handled some in a 
> slightly funny way (strings, scalars). Note that "slightly funny" is 
> meant derogatory here, doing automatic conversion for these types is 
> often a good idea, but may come back to haunt us now that unicode is 
> more important, and now that a Python program may have obtained a 
> CFString object from another source.

The funny conversions grew up since the last time you looked at them: 
Unicode is handled correctly (I added this when I wanted to process 
keyboard events for function keys, those are unicode characters without 
an ASCII equivalent).

Ronald