Eric Blake <[email protected]> writes:
> On 10/02/2015 08:12 AM, Markus Armbruster wrote:
>
>>> Actually, this only works for implicit objects. Implicit enums instead
>>> have self.name[-4:] == 'Kind'. But qapi-types cares about implicit
>>> objects only. So if I hoist this, I may need something like:
>>>
>>> def is_implicit(self, type=None):
>>> if type and not isinstance(self, type):
>>> return Fals
>>> if isinstance(self, QAPISchemaObjectType):
>>> return self.name[0] == ':'
>>> if isinstance(self, QAPISchemaEnumType):
>>> return self.name[-4:] == 'Kind'
>>> return False
>>>
>>> where qapi-types would call entity.is_implicit(QAPISchemaObjectType).
>>
>> Do it the OO-way: QAPISchemaEntity.is_implicit() returns False. Any
>> subclass that can have implicitly defined instances overrides it:
>> QAPISchemaObjectType.is_implicit() tests for ':' prefix,
>> QAPISchemaEnumType.is_implicit() tests for 'Kind' suffix (requires
>> outlawing it for user enums, if we don't do it already), and so forth.
>
> But there's still the issue of filtering by subclass. For the
> qapi-types visit_needed() filter, I either write:
>
> if isinstance(entity, QAPISchemaObjectType) and entity.is_implicit()
If is_implicit() is defined on entities, then this shrinks to just
entity.is_implicit()
because no non-type entity is implicit.
> or what I want to write:
>
> if entity.is_implicit(QAPISchemaObjectType)
I'm not even sure what that's supposed to mean :)
> while still allowing the common case of is_implicit() when I don't care
> which type is doing the testing. Since python doesn't allow method
> overloads, I'd have to repeat the:
>
> def is_implicit(self, type=None):
> if type and not isinstance(self, type):
> return False
>
> prefix in each subclass that overrides the basic version.
AH, you seem to propose to define E.is_implicit(T) as "E is implicitly
defined and not an instance of T". Why not simply keep the two
predicates seperate? Am I missing something?
[...]