When data is passed from Python to a native library (such as in an O/S call), how does the unboxing of data types occur?
For a specific instance, os.open allows an integer whose various bits express
desired behavior as `flags` -- if flags is
1, for example, the file is open write-only.
If I pass an int-like object to os.open, __int__ is called; if I pass a thin
wrapper over int to os.open, __int__ is not
called.
So the real question: anywhere in Python where an int is expected (for
lower-level API work), but not directly
received, should __int__ (or __index__) be called? and failure to do so is a
bug?
Here's my simple test code:
class Wrap:
def __init__(self, value):
self.value = value
def __int__(self):
print('__int__')
return self.value
def __index__(self):
print('__index__')
return self.value
class Thin(int):
def __int__(self):
print('__int__')
return super().__int__()
def __index__(self):
print('__index__')
return super().__index__()
two = Wrap(2)
[0, 1, 2][two]
# __index__
# 2
import struct
struct.pack('i', two)
# __index__
# b'\x02\x00\x00\x00'
t = Thin(1)
huh = os.open('blah.txt', t)
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# FileNotFoundError: [Errno 2] No such file or directory: 'blah.txt'
--
~Ethan~
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Python-Dev mailing list [email protected] https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com
