On Mon, Oct 05, 2020 at 09:12:26AM +0200, Philipp Hahn wrote:
Hello,
currently my Merge Quests
<
https://gitlab.com/libvirt/libvirt-python/-/merge_requests/9> is stuck
because there are some open technical discussions:
1. The Python binding consists of two layers:
- libvirtmod* is the low-level C-like API, which mostly is just a
thin wrapper around the C-library. It is generated from the API.xml files
- The high-level libvirt* modules, providing an object oriented API,
which is also generated from the API.xml files.
In both cases there are many exceptions defines via
libvirt*-override-api.xml or coded in generator.py:
- skip_impl: Generate Python code, but skip C implementation
- custom_function: Generate neither C nor Python code - hand crafted code
- skip_function: Generate neither C nor Python code - not used at all
- function_skip_python_impl: Generate C code, but skip python impl
Previously the functions listed in "skip_impl" were also duplicated in
the "libvirt-*override-api.xml" files, which is somehow hard to
maintain. With d19699e48ce9c17481f94b4dc0715e18e05d5adb I removed all
those names from "skip_impl", which are also listed in the overrides and
added code to add them back when "generator.py" is invoked.
For this to work I had to change several "files" attributes to start
with "python", which looks okay to me, but still would like to get verified.
The generator.py is such a big hack I don't think it matters too much.
The real important thing is that the resulting code is sane.
2. The low-level library works mostly with bytes, but the high-level
Python API uses nested Lists, Tuples and Dicts. To get most out of the
Python static type annotations the input and output parameters should be
modled in as much detail as possible.
This requires to store those types somewhere. My current
46592e28124858ed863bceba65c3dafa2bbb02cd adds some often used types to
generator.py and then references them from the overrides.xml:
> + 'PyListSecret': ('', 'List["virSecret"]',
'', ''),
> + 'PyDictAny': ('', 'Dict[str, Any]', '',
''),
> + <return type='PyListSecret' info='the list of secrets or None
in case of error'/>
This still is very painful as there are many "used-once" types, which
still must be declared and used in two places.
So far the "return" type was used for the "C" type and currently I
mis-use it for referencing it for my Python types. This doesn't look
right, so I would prefer adding a new attribute which can be used to
override the Python type.
This also would probably nicely fit with functions like
"virDomainOpenConsole", when "dev_name" is optional and can be
"None",
which the current type hint requires a "string".
Is extending the libvirt*-override-api.xml files okay or must this be
coordinated with the other parts of the project?
These files follow the same schema as the main api.xml files shipped by
libvirt itself. That is just a matter of convenience though - the
overrides are only used in the libvirt-python generator.py, so there
is no reason why we can't record extra information in them.
Regards,
Daniel
--
|:
https://berrange.com -o-
https://www.flickr.com/photos/dberrange :|
|:
https://libvirt.org -o-
https://fstop138.berrange.com :|
|:
https://entangle-photo.org -o-
https://www.instagram.com/dberrange :|