82 lines
2.4 KiB
Python
Executable File
82 lines
2.4 KiB
Python
Executable File
import _objc
|
|
|
|
__all__ = []
|
|
|
|
|
|
class OC_PythonFloat(float):
|
|
__slots__=('__pyobjc_object__',)
|
|
|
|
|
|
def __new__(cls, obj, value):
|
|
self = float.__new__(cls, value)
|
|
self.__pyobjc_object__ = obj
|
|
return self
|
|
|
|
__class__ = property(lambda self: self.__pyobjc_object__.__class__)
|
|
|
|
def __getattr__(self, attr):
|
|
return getattr(self.__pyobjc_object__, attr)
|
|
|
|
class OC_PythonLong(long):
|
|
|
|
def __new__(cls, obj, value):
|
|
self = long.__new__(cls, value)
|
|
self.__pyobjc_object__ = obj
|
|
return self
|
|
|
|
__class__ = property(lambda self: self.__pyobjc_object__.__class__)
|
|
|
|
def __getattr__(self, attr):
|
|
return getattr(self.__pyobjc_object__, attr)
|
|
|
|
# The long type doesn't support __slots__ on subclasses, fake
|
|
# one part of the effect of __slots__: don't allow setting of attributes.
|
|
def __setattr__(self, attr, value):
|
|
if attr != '__pyobjc_object__':
|
|
raise AttributeError, "'%s' object has no attribute '%s')"%(self.__class__.__name__, attr)
|
|
self.__dict__['__pyobjc_object__'] = value
|
|
|
|
class OC_PythonInt(int):
|
|
__slots__=('__pyobjc_object__',)
|
|
|
|
def __new__(cls, obj, value):
|
|
self = int.__new__(cls, value)
|
|
self.__pyobjc_object__ = obj
|
|
return self
|
|
|
|
__class__ = property(lambda self: self.__pyobjc_object__.__class__)
|
|
|
|
def __getattr__(self, attr):
|
|
return getattr(self.__pyobjc_object__, attr)
|
|
|
|
NSNumber = _objc.lookUpClass('NSNumber')
|
|
NSDecimalNumber = _objc.lookUpClass('NSDecimalNumber')
|
|
Foundation = None
|
|
|
|
def numberWrapper(obj):
|
|
if isinstance(obj, NSDecimalNumber):
|
|
return obj
|
|
# ensure that NSDecimal is around
|
|
global Foundation
|
|
if Foundation is None:
|
|
import Foundation
|
|
# return NSDecimal
|
|
return Foundation.NSDecimal(obj)
|
|
try:
|
|
tp = obj.objCType()
|
|
except AttributeError:
|
|
import warnings
|
|
warnings.warn(RuntimeWarning, "NSNumber instance doesn't implement objCType? %r" % (obj,))
|
|
return obj
|
|
if tp in 'qQLfd':
|
|
if tp == 'q':
|
|
return OC_PythonLong(obj, obj.longLongValue())
|
|
elif tp in 'QL':
|
|
return OC_PythonLong(obj, obj.unsignedLongLongValue())
|
|
else:
|
|
return OC_PythonFloat(obj, obj.doubleValue())
|
|
else:
|
|
return OC_PythonInt(obj, obj.longValue())
|
|
|
|
_objc.setNSNumberWrapper(numberWrapper)
|