[Python-3000] struni and the Apple four-character-codes

Ronald Oussoren ronaldoussoren at mac.com
Fri Jul 27 08:11:28 CEST 2007


On 27 Jul, 2007, at 5:38, Jeffrey Yasskin wrote:

> I've sent the patch as http://python.org/sf/1761465 using Guido's
> suggestion of using bytes, but I do philosophically prefer Talin's and
> Ronald's suggestions.
>
> On 7/25/07, Ronald Oussoren <ronaldoussoren at mac.com> wrote:
>> I've CC-ed Jack Jansen as he has maintained the Mac libraries for  
>> ages (from way before OS9 was shiny and new).
>
> Did you mean to add him to this thread?

Yes, but I obviously failed to actually add this address to the CC  
list :-(.
>
>
>> On Wednesday, July 25, 2007, at 07:18AM, "Jeffrey Yasskin" <jyasskin at gmail.com 
>> > wrote:
>> > 5) Make a new hashable class for these codes which converts them to
>> >and from ints and bytes and becomes the general argument type for  
>> the
>> >apple platform interface. [Cleanest, but lots of work that I'm not
>> >volunteering to do]
>>
>> A 6th option is a subclass of int. It's constructor would accept a  
>> string containing the 4CC and the repr/str method would return the  
>> string representation of the code.  IMHO this is the cleanest  
>> representation of 4CCs in Python because those codes are basicy a  
>> "neat" way to enter integer literals in C.
>
> Naïve question: How does that differ from option (5)? Just the
> isinstance() behavior?

That's the only change, but it is an important one. To reiterate: 4- 
character-codes in C are numeric literals and it would be best if  
Python reflected that fact to avoid surprises. 4-character-codes are  
definitely not arrays of bytes.

One example of an API that returns a dictionary where some keys refer  
to values that are commonly encoded using 4-character-codes is - 
[NSFileManager fileAttributesAtPath:traverseLink].

>
>
> I said this would take a lot of work because I think the new type
> needs to be implemented in C to be returned from PyMac_GetOSType(),
> and it seemed like a bigger API change than just switching to bytes,
> but it turns out that switching to bytes isn't particularly trivial
> either when you have to cast for every use in a dict, so maybe the new
> type would be easier.

The new type would be easier and the API change isn't too bad. I don't  
think you'd have to implement this type in C, there just needs to be a  
hook to tell the C code about this type.

>
>
>> This would also solve a problem that PyObjC users sometimes run  
>> into: Several C/Objective-C APIs return a dictionary where one  of  
>> the values is an integer and where one would commonly use 4CCs to  
>> write down literals. This currently causes unexpected failures but  
>> would do the right thing with this option.
>
> I don't think that option (6) by itself solves with that particular
> problem. If you call str() on one of those ints, you'd just get a
> number, which is different from what would happen if you call str() on
> the 4CC type. It might help though by handling comparisons correctly.

That's what I meant by "the right thing": code would just work except  
for not printing a nice human-readable value. As you don't have to do  
that a lot anyway that's not really a problem.

Ronald
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 3562 bytes
Desc: not available
Url : http://mail.python.org/pipermail/python-3000/attachments/20070727/56c25928/attachment.bin 


More information about the Python-3000 mailing list