ePolyglot: Examination and development of multilanguage programming using Eiffel, Python, and Haskell | ||
---|---|---|
Prev | Chapter 16. The ePolyglot Eiffel object hierarchy | Next |
The classes PYTHON_SEQUENCE, PYTHON_STRING, PYTHON_LIST, and PYTHON_TUPLE allow manipulation of Python sequences of the appropriate types.
The base class for all Python sequences, allowing rudimentary manipulation of sequence members
class interface PYTHON_SEQUENCE -- base class for python sequences--strings, tuples, lists creation make_from_new_reference (new_python_object_pointer: POINTER) -- uses the given object pointer without increasing reference -- count of the python object. Used because several Python C -- api calls generate a new object with a reference count of -- 1, and we don't want to increase that or we get too many -- false references require new_python_object_pointer.is_not_null make_from_borrowed_reference (new_python_object_pointer: POINTER) -- uses the given object pointer and increases the reference -- count of the given python object. Used in cases where the -- Python C api does not automatically increase the reference -- count. Terminology ("borrowed reference" vs "new reference") -- is taken from the Python C Api documentation require new_python_object_pointer.is_not_null make_from_python_object (object: PYTHON_OBJECT) -- uses the existing python_object_pointer of python_object require object /= Void feature(s) from PYTHON_SEQUENCE length: INTEGER -- number of elements in the sequence require is_sequence ensure last_python_integer_result_ok; last_python_integer_result_ok concat (other: like Current): like Current -- the result of the current sequence appended by other require is_sequence ensure Result.reference_count = 1 repeat (repeat_count: INTEGER): like Current require is_sequence -- this sequence repeated 'count' times -- this sequence repeated 'count' times ensure Result.reference_count = 1 feature(s) from PYTHON_SEQUENCE -- from COLLECTION lower: INTEGER upper: INTEGER size: INTEGER count: INTEGER item (index: INTEGER): PYTHON_OBJECT -- item at position index infix "@" (index: INTEGER): PYTHON_OBJECT -- item at position index get_slice (low, up: INTEGER): like Current -- create a new collection initialized with elements from range low..up slice (low, up: INTEGER): like Current -- create a new collection initialized with elements from range low..up put (element: like item; index: INTEGER) -- put element at position index ensure last_python_integer_result_ok remove (index: INTEGER) -- remove item at index; following items are shifted left by one positions ensure last_python_integer_result_ok set_slice (v: like item; lower_index, upper_index: INTEGER) -- set the slice from lower_index to upper_index with v ensure last_python_integer_result_ok set_slice_with (v: like item; lower_index, upper_index: INTEGER) -- set the slice from lower_index to upper_index with v ensure last_python_integer_result_ok del_slice (lower_index, upper_index: INTEGER) -- delete the slice from lower_index to upper_index ensure last_python_integer_result_ok to_tuple: PYTHON_TUPLE -- returns the sequence as a tuple count_of_value (value: like item): INTEGER -- returns the number of items in the collection equal to value ensure last_python_integer_result_ok contains (value: like item): BOOLEAN -- whether or not the collection contains the given value ensure last_python_integer_result_ok index_of (element: like item): INTEGER -- index of the given item. If the item is not in the -- collection, return -1 -- note that this is different from -- the Eiffel library standard! require contains(element) ensure last_python_integer_result_ok appended_with (other: like Current): like Current -- returns this object appended with another sequence of the -- same type infix "+" (other: like Current): like Current -- returns this object appended with another sequence of the -- same type invariant reference_count >= 0; valid_reference: not is_none implies is_sequence; valid_length: is_sequence implies length >= 0; end of PYTHON_SEQUENCE |
A class for manipulating Python strings. Note that Python strings are immutable sequences and are cached for performance reasons; the reference count of a string may be surprisingly high if it matches a string already in the cache--the Python object simply refers to the cached string
class interface PYTHON_STRING -- mirror to all the python string API calls--in time, will make -- this conform to the Eiffel string interface creation make -- create an empty string from_string (s: STRING) -- initialize from the characters of s, including all marshaling to -- and from C strings ensure reference_count > 0 -- the above ensure clause specifies "> 0" because python caches -- strings. The initialization of a unique string will -- leave a reference count of 1, but otherwise it could be -- any positive number from_external (p: POINTER) -- initialize from a C-style string... as PyString_FromString from_string_and_size (s: STRING; new_length: INTEGER) -- initialize from C-style string... as PyString_FromStringAndSize make_from_new_reference (new_python_object_pointer: POINTER) -- uses the given object pointer without increasing reference -- count of the python object. Used because several Python C -- api calls generate a new object with a reference count of -- 1, and we don't want to increase that or we get too many -- false references require new_python_object_pointer.is_not_null make_from_borrowed_reference (new_python_object_pointer: POINTER) -- uses the given object pointer and increases the reference -- count of the given python object. Used in cases where the -- Python C api does not automatically increase the reference -- count. Terminology ("borrowed reference" vs "new reference") -- is taken from the Python C Api documentation require new_python_object_pointer.is_not_null make_from_python_object (object: PYTHON_OBJECT) -- uses the existing python_object_pointer of python_object require object /= Void feature(s) from PYTHON_STRING make -- create an empty string from_string (s: STRING) -- initialize from the characters of s, including all marshaling to -- and from C strings ensure reference_count > 0 -- the above ensure clause specifies "> 0" because python caches -- strings. The initialization of a unique string will -- leave a reference count of 1, but otherwise it could be -- any positive number from_external (p: POINTER) -- initialize from a C-style string... as PyString_FromString from_string_and_size (s: STRING; new_length: INTEGER) -- initialize from C-style string... as PyString_FromStringAndSize length: INTEGER -- length of the string require is_sequence ensure last_python_integer_result_ok; last_python_integer_result_ok; last_python_integer_result_ok to_external: POINTER -- C representation of the string to_string: STRING -- STRING representation format (args: PYTHON_OBJECT): PYTHON_OBJECT -- formats according to PyString_Format invariant reference_count >= 0; valid_reference: not is_none implies is_sequence; valid_length: is_sequence implies length >= 0; valid_reference: not is_none implies is_string; end of PYTHON_STRING |
Python lists are analogous to Eiffel ARRAYs, allowing elements to be inserted and removed.
class interface PYTHON_LIST -- implementation of Python list objects creation make -- creates an empty list with_capacity (new_capacity: INTEGER) -- creates the array with the given length make_from_borrowed_reference (new_python_object_pointer: POINTER) -- uses the given object pointer and increases the reference -- count of the given python object. Used in cases where the -- Python C api does not automatically increase the reference -- count. Terminology ("borrowed reference" vs "new reference") -- is taken from the Python C Api documentation require new_python_object_pointer.is_not_null make_from_new_reference (new_python_object_pointer: POINTER) -- uses the given object pointer without increasing reference -- count of the python object. Used because several Python C -- api calls generate a new object with a reference count of -- 1, and we don't want to increase that or we get too many -- false references require new_python_object_pointer.is_not_null make_from_python_object (object: PYTHON_OBJECT) -- uses the existing python_object_pointer of python_object require object /= Void feature(s) from PYTHON_LIST -- creation with_capacity (new_capacity: INTEGER) -- creates the array with the given length make -- creates an empty list feature(s) from PYTHON_LIST -- other features length: INTEGER -- number of items in the list require is_sequence ensure last_python_integer_result_ok; last_python_integer_result_ok; last_python_integer_result_ok item (index: INTEGER): PYTHON_OBJECT -- item at the given index infix "@" (index: INTEGER): PYTHON_OBJECT -- item at the given index put (element: like item; index: INTEGER) -- put element at index ensure last_python_integer_result_ok; last_python_integer_result_ok add (element: like item; index: INTEGER) -- insert element at index, shifting following items right one position ensure last_python_integer_result_ok insert (element: like item; index: INTEGER) -- insert element at index, shifting following items right one position ensure last_python_integer_result_ok append (element: like item) -- add item to the end of the list ensure last_python_integer_result_ok add_last (element: like item) -- add item to the end of the list ensure last_python_integer_result_ok get_slice (lower_index, upper_index: INTEGER): like Current -- gets the slice between lower_index and upper_index slice (lower_index, upper_index: INTEGER): like Current -- gets the slice between lower_index and upper_index set_slice (v: like item; lower_index, upper_index: INTEGER) -- sets the slice with the given item v ensure last_python_integer_result_ok; last_python_integer_result_ok set_slice_with (v: like item; lower_index, upper_index: INTEGER) -- sets the slice with the given item v ensure last_python_integer_result_ok; last_python_integer_result_ok sort -- sorts the list ensure last_python_integer_result_ok reverse -- reverses the list in place ensure last_python_integer_result_ok to_tuple: PYTHON_TUPLE -- transforms the list into a tuple invariant reference_count >= 0; valid_reference: not is_none implies is_sequence; valid_length: is_sequence implies length >= 0; valid_reference: not is_none implies is_list; end of PYTHON_LIST |
Python tuples, similar to immutable arrays, are used for passing arguments to Python functions as well as sundry other uses.
class interface PYTHON_TUPLE creation make -- empty tuple with_capacity (new_length: INTEGER) -- creates the tuple with the given capacity ensure last_python_pointer_result_ok make_from_borrowed_reference (new_python_object_pointer: POINTER) -- uses the given object pointer and increases the reference -- count of the given python object. Used in cases where the -- Python C api does not automatically increase the reference -- count. Terminology ("borrowed reference" vs "new reference") -- is taken from the Python C Api documentation require new_python_object_pointer.is_not_null make_from_new_reference (new_python_object_pointer: POINTER) -- uses the given object pointer without increasing reference -- count of the python object. Used because several Python C -- api calls generate a new object with a reference count of -- 1, and we don't want to increase that or we get too many -- false references require new_python_object_pointer.is_not_null make_from_python_object (object: PYTHON_OBJECT) -- uses the existing python_object_pointer of python_object require object /= Void feature(s) from PYTHON_TUPLE make -- empty tuple with_capacity (new_length: INTEGER) -- creates the tuple with the given capacity ensure last_python_pointer_result_ok length: INTEGER -- number of items in the tuple require is_sequence ensure last_python_integer_result_ok; last_python_integer_result_ok; last_python_integer_result_ok item (index: INTEGER): PYTHON_OBJECT -- item at the given index ensure last_python_pointer_result_ok infix "@" (index: INTEGER): PYTHON_OBJECT -- item at the given index ensure last_python_pointer_result_ok get_slice (low, up: INTEGER): like Current -- slice between given limits ensure last_python_pointer_result_ok slice (low, up: INTEGER): like Current -- slice between given limits ensure last_python_pointer_result_ok put (element: like item; index: INTEGER) -- sets element at index ensure last_python_integer_result_ok; last_python_integer_result_ok invariant reference_count >= 0; valid_reference: not is_none implies is_sequence; valid_length: is_sequence implies length >= 0; valid_reference: not is_none implies is_tuple; end of PYTHON_TUPLE |