Class PyType
- All Implemented Interfaces:
Serializable
,Traverseproc
- Direct Known Subclasses:
PyJavaType
,PyTypeDerived
type
object and the static methods and data
structures that support the Python type system in Jython (the type registry).
The class PyType
contains static data that describes Python types, that are
consulted and modified through its static API (notably fromClass(Class)
). The data
structures are guarded against modification by concurrent threads (or consultation while being
modified). They support construction of type
objects that are visible to Python.
Bootstrapping of the type system: The first attempt to construct or get a
PyObject
(or instance of a subclass of PyObject
), to use the Py
class utilities, or to call fromClass(Class)
, causes the Jython type system to be
initialised. By the time that call returns, the type system will be in working order: any
PyType
s the application sees will be fully valid. Also, provided that the static
initialisation of the PyObject
subclass in question is not obstructed for any other
reason, the instance returned will also be fully functional. Note that it is possible to refer to
C.class
, and (if it is not an exposed type) to produce a PyType
for it,
without causing the static initialisation of C
.
This may be no less than the reader expected, but we mention it because, for classes encountered
during the bootstrapping of the type system, this guarantee is not offered. The (static)
initialisation of the type system is highly reentrant. Classes that are used by the type system
itself, and their instances, do encounter defective PyType
objects. Instances
of these classes, which include mundane classes like PyNone
and
PyString
, may exist before their class is statically initialised in the JVM sense.
The type system has been implemented with this fact constantly in mind. The PyType
encountered is always the "right" one — the unique instance representing the Python type of
that class — but it may not be completely filled in. Debugging that enters these classes
during bootstrapping will take surprising turns. Changes to these classes should also take this
into account.
- See Also:
-
Nested Class Summary
Nested classes/interfaces inherited from class org.python.core.PyObject
PyObject.ConversionException
-
Field Summary
Fields inherited from class org.python.core.PyObject
gcMonitorGlobal
-
Method Summary
Modifier and TypeMethodDescriptionThe basic method to override when implementing a callable object.void
__delattr__
(String name) A variant of the __delattr__ method which accepts a String as the key.__findattr_ex__
(String name) Attribute lookup hook.void
__setattr__
(String name, PyObject value) A variant of the __setattr__ method which accepts a String as the key.__tojava__
(Class<?> c) Equivalent to the Jython __tojava__ method.static void
addBuilder
(Class<?> c, org.python.expose.TypeBuilder builder) Register theTypeBuilder
for the given class.void
addMethod
(PyBuiltinMethod meth) Adds the given method to this type's dict under its name in its descriptor.void
compatibleForAssignment
(PyType other, String attribute) Ensures that the physical layout between this type andother
are compatible.void
delBases()
void
delDict()
void
static boolean
Attempt to ensure that the that the type system has fully constructed the types necessary to build a fully-working, exposed,PyObject
(the "bootstrap types").static void
Ensure dict contains a __doc__.static void
ensureModule
(PyObject dict) Ensure dict contains a __module__, retrieving it from the current frame if it doesn't exist.Returns the actual dict underlying this type instance.static PyType
Look up (create if necessary) thePyType
for the given target Java class.static PyType
Equivalent tofromClass(Class)
, which is to be preferred.getBase()
getBases()
getDict()
xxx implements where meaningfulgetDoc()
Equivalent of CPython's typeobject.c::type_get_doc; handles __doc__ descriptors.getFlags()
getMro()
getName()
int
Class<?>
Returns the Java Class that this type inherits from, or null if this type is Python-only.instDict()
boolean
Attribute lookup for name through mro objects' dicts.lookup_where
(String name, PyObject[] where) Attribute lookup for name through mro objects' dicts.final boolean
Offers public read-only access to the protected field needs_finalizer.static PyObject
void
noAttributeError
(String name) Raises AttributeError on type objects.void
void
boolean
Optional operation.void
removeMethod
(PyBuiltinMethod meth) Removes the given method from this type's dict or raises a KeyError.void
setAbstractmethods
(PyObject value) void
void
void
super_lookup
(PyType ref, String name) toString()
int
Traverses all directly containedPyObject
s.type___eq__
(PyObject other) type___ge__
(PyObject other) type___gt__
(PyObject other) final boolean
type___le__
(PyObject other) type___lt__
(PyObject other) type___ne__
(PyObject other) final boolean
final PyObject
Methods inherited from class org.python.core.PyObject
__abs__, __add__, __and__, __call__, __call__, __call__, __call__, __call__, __call__, __call__, __call__, __call__, __call__, __call__, __call__, __call__, __call__, __call__, __cmp__, __coerce__, __coerce_ex__, __complex__, __contains__, __delattr__, __delete__, __delitem__, __delitem__, __delslice__, __delslice__, __dir__, __div__, __divmod__, __ensure_finalizer__, __eq__, __findattr__, __findattr__, __finditem__, __finditem__, __finditem__, __float__, __floordiv__, __format__, __ge__, __get__, __getattr__, __getattr__, __getitem__, __getitem__, __getnewargs__, __getslice__, __getslice__, __gt__, __hash__, __hex__, __iadd__, __iand__, __idiv__, __idivmod__, __ifloordiv__, __ilshift__, __imod__, __imul__, __index__, __int__, __invert__, __ior__, __ipow__, __irshift__, __isub__, __iter__, __iternext__, __itruediv__, __ixor__, __le__, __len__, __long__, __lshift__, __lt__, __mod__, __mul__, __ne__, __neg__, __nonzero__, __not__, __oct__, __or__, __pos__, __pow__, __pow__, __radd__, __rand__, __rdiv__, __rdivmod__, __reduce__, __reduce_ex__, __reduce_ex__, __repr__, __rfloordiv__, __rlshift__, __rmod__, __rmul__, __ror__, __rpow__, __rrshift__, __rshift__, __rsub__, __rtruediv__, __rxor__, __set__, __setattr__, __setitem__, __setitem__, __setitem__, __setslice__, __setslice__, __str__, __sub__, __truediv__, __trunc__, __unicode__, __xor__, _add, _and, _callextra, _cmp, _div, _divmod, _doget, _doget, _doset, _eq, _floordiv, _ge, _gt, _iadd, _iand, _idiv, _idivmod, _ifloordiv, _ilshift, _imod, _imul, _in, _ior, _ipow, _irshift, _is, _isnot, _isub, _itruediv, _ixor, _jcall, _jcallexc, _jthrow, _le, _lshift, _lt, _mod, _mul, _ne, _notin, _or, _pow, _rshift, _sub, _truediv, _xor, asDouble, asIndex, asIndex, asInt, asInt, asIterable, asLong, asLong, asName, asName, asString, asString, asStringOrNull, asStringOrNull, bit_length, conjugate, delType, dispatch__init__, equals, fastGetClass, getType, hashCode, implementsDescrDelete, implementsDescrGet, implementsDescrSet, invoke, invoke, invoke, invoke, invoke, invoke, isCallable, isDataDescr, isIndex, isInteger, isMappingType, isNumberType, isSequenceType, object___subclasshook__, readonlyAttributeError, setType
-
Field Details
-
TYPE
ThePyType
ofPyType
(ortype(type)
).
-
-
Method Details
-
newType
-
ensureDoc
Ensure dict contains a __doc__.- Parameters:
dict
- a PyObject mapping
-
ensureModule
Ensure dict contains a __module__, retrieving it from the current frame if it doesn't exist.- Parameters:
dict
- a PyObject mapping
-
getStatic
-
needsFinalizer
public final boolean needsFinalizer()Offers public read-only access to the protected field needs_finalizer.- Returns:
- a boolean indicating whether the type implements __del__
-
compatibleForAssignment
Ensures that the physical layout between this type andother
are compatible. Raises a TypeError if not. -
type___eq__
-
type___ne__
-
type___le__
-
type___lt__
-
type___ge__
-
type___gt__
-
getBase
-
getBases
-
delBases
public void delBases() -
setBases
-
instDict
-
getMro
-
getFlags
-
type___subclasses__
-
type___subclasscheck__
-
type___instancecheck__
-
getProxyType
Returns the Java Class that this type inherits from, or null if this type is Python-only. -
isSubType
-
lookup
Attribute lookup for name through mro objects' dicts. Lookups are cached.- Parameters:
name
- attribute name (must be interned)- Returns:
- found object or null
-
lookup_where
Attribute lookup for name through mro objects' dicts. Lookups are cached. Returns where in the mro the attribute was found at where[0].- Parameters:
name
- attribute name (must be interned)where
- Where in the mro the attribute was found is written to index 0- Returns:
- found object or null
-
super_lookup
-
addBuilder
Register theTypeBuilder
for the given class. This only really makes sense for aPyObject
. Initialising a properly-formed PyObject will usually result in a call toaddBuilder
, thanks to code inserted by the Jython type-exposer.- Parameters:
c
- class for which this is the builderbuilder
- to register
-
ensureBootstrapped
public static boolean ensureBootstrapped()Attempt to ensure that the that the type system has fully constructed the types necessary to build a fully-working, exposed,PyObject
(the "bootstrap types"). Produce a warning message if it does not seem to have worked. This is called at the end of the static initialisation ofPyObject
.- Returns:
- whether bootstrapping was successful
-
fromClass
Equivalent tofromClass(Class)
, which is to be preferred.The boolean argument is ignored. Previously it controlled whether the returned
PyType
remained strongly-reachable through a reference the type registry would keep. The returned object is now reachable as long as the classc
remains loaded.- Parameters:
c
- for which the correspondingPyType
is to be foundhardRef
- ignored- Returns:
- the
PyType
found or created
-
fromClass
Look up (create if necessary) thePyType
for the given target Java class. If the target'sPyType
already exists, this is returned quickly. When aPyType
must be created, the method updates the registry of type information internal to Jython, caching the answer for next time.Creating the
PyType
also looks up or creates anyPyType
s that the target depends upon, which results in re-entrant calls tofromClass
for these classes and (ifPyType
s are created forPyObject
s) calls toaddBuilder(Class, TypeBuilder)
.Look-up of existing types is non-blocking in the majority of cases.
- Parameters:
c
- for which the correspondingPyType
is to be found- Returns:
- the
PyType
found or created
-
__findattr_ex__
Description copied from class:PyObject
Attribute lookup hook. If the attribute is not found, null may be returned or a Py.AttributeError can be thrown, whatever is more correct, efficient and/or convenient for the implementing class. Client code should usePyObject.__getattr__(String)
orPyObject.__findattr__(String)
. Both methods have a clear policy for failed lookups.- Overrides:
__findattr_ex__
in classPyObject
- Returns:
- The looked up value. May return null if the attribute is not found
-
__setattr__
Description copied from class:PyObject
A variant of the __setattr__ method which accepts a String as the key. This String must be interned.- Overrides:
__setattr__
in classPyObject
- Parameters:
name
- the name whose value will be set - must be an interned string .value
- the value to set this name to- See Also:
-
addMethod
Adds the given method to this type's dict under its name in its descriptor. If there's an existing item in the dict, it's replaced. -
removeMethod
Removes the given method from this type's dict or raises a KeyError. -
__delattr__
Description copied from class:PyObject
A variant of the __delattr__ method which accepts a String as the key. This String must be interned. By default, this will call__delattr__(PyString name)
with the appropriate args. The only reason to override this method is for performance.- Overrides:
__delattr__
in classPyObject
- Parameters:
name
- the name which will be removed - must be an interned string .- See Also:
-
__call__
Description copied from class:PyObject
The basic method to override when implementing a callable object. The first len(args)-len(keywords) members of args[] are plain arguments. The last len(keywords) arguments are the values of the keyword arguments. -
fastGetName
-
pyGetName
-
getName
-
pySetName
-
setName
-
pyDelName
public void pyDelName() -
fastGetDict
Returns the actual dict underlying this type instance. Changes to Java types should go throughaddMethod(org.python.core.PyBuiltinMethod)
andremoveMethod(org.python.core.PyBuiltinMethod)
, or unexpected mro errors can occur.- Overrides:
fastGetDict
in classPyObject
- Returns:
- internal object per instance dict or null
-
getDict
Description copied from class:PyObject
xxx implements where meaningful -
setDict
-
delDict
public void delDict() -
getDoc
Equivalent of CPython's typeobject.c::type_get_doc; handles __doc__ descriptors. -
__tojava__
Description copied from class:PyObject
Equivalent to the Jython __tojava__ method. Tries to coerce this object to an instance of the requested Java class. Returns the special objectPy.NoConversion
if thisPyObject
can not be converted to the desired Java class.- Overrides:
__tojava__
in classPyObject
- Parameters:
c
- the Class to convert thisPyObject
to.
-
getModule
-
delModule
public void delModule() -
getAbstractmethods
-
setAbstractmethods
-
getNumSlots
public int getNumSlots() -
toString
-
noAttributeError
Raises AttributeError on type objects. The message differs from PyObject#noAttributeError, to mimic CPython behaviour.- Overrides:
noAttributeError
in classPyObject
-
traverse
Description copied from interface:Traverseproc
Traverses all directly containedPyObject
s. Like in CPython,arg
must be passed unmodified tovisit
as its second parameter. IfVisitproc.visit(PyObject, Object)
returns nonzero, this return value must be returned immediately by traverse.Visitproc.visit(PyObject, Object)
must not be called with anull
PyObject-argument.- Specified by:
traverse
in interfaceTraverseproc
-
refersDirectlyTo
Description copied from interface:Traverseproc
Optional operation. Should only be implemented if it is more efficient than callingTraverseproc.traverse(Visitproc, Object)
with a visitproc that just watches out forob
. Must returnfalse
ifob
isnull
.- Specified by:
refersDirectlyTo
in interfaceTraverseproc
- Throws:
UnsupportedOperationException
-