-
Notifications
You must be signed in to change notification settings - Fork 3.4k
[Python] Enhance object API __init__
with typed keyword arguments
#8615
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
3df6969
to
2043352
Compare
Nice, but im almost certain this will break Python 2 support
Some guarding against that would be probably useful |
45a426b
to
0455d8c
Compare
This commit significantly improves the developer experience for the Python Object-Based API by overhauling the generated `__init__` method for `T`-suffixed classes. Previously, `T` objects had to be instantiated with an empty constructor, and their fields had to be populated manually one by one. This was verbose and not idiomatic Python. This change modifies the Python code generator (`GenInitialize`) to produce `__init__` methods that are: 1. **Keyword-Argument-Friendly**: The constructor now accepts all table/struct fields as keyword arguments, allowing for concise, single-line object creation. 2. **Fully Typed**: The signature of the `__init__` method is now annotated with Python type hints. This provides immediate benefits for static analysis tools (like Mypy) and IDEs, enabling better autocompletion and type checking. 3. **Correctly Optional**: The generator now correctly wraps types in `Optional[...]` if their default value is `None`. This applies to strings, vectors, and other nullable fields, ensuring strict type safety. The new approach remains **fully backward-compatible**, as all arguments have default values. Existing code that uses the empty constructor will continue to work without modification. #### Example of a Generated `__init__` **Before:** ```python class KeyValueT(object): def __init__(self): self.key = None # type: str self.value = None # type: str ``` **After:** ```python class KeyValueT(object): def __init__(self, key: Optional[str] = None, value: Optional[str] = None): self.key = key self.value = value ``` #### Example of User Code **Before:** ```python # Old, verbose way kv = KeyValueT() kv.key = "instrument" kv.value = "EUR/USD" ``` **After:** ```python # New, Pythonic way kv = KeyValueT(key="instrument", value="EUR/USD") ```
0455d8c
to
c588585
Compare
The code was generated with |
I guess this flag should not be part of |
@aardappel I just tested this and it looks good to me 👍 if @akb825 has no more comments i guess this could be merged? |
@aardappel i guess this can be merged? |
Sorry, I forgot to reply earlier, looks good on my end. |
thanks :) |
This commit significantly improves the developer experience for the Python Object-Based API by overhauling the generated
__init__
method forT
-suffixed classes.Previously,
T
objects had to be instantiated with an empty constructor, and their fields had to be populated manually one by one. This was verbose and not idiomatic Python.This change modifies the Python code generator (
GenInitialize
) to produce__init__
methods that are:Keyword-Argument-Friendly: The constructor now accepts all table/struct fields as keyword arguments, allowing for concise, single-line object creation.
Fully Typed: The signature of the
__init__
method is now annotated with Python type hints. This provides immediate benefits for static analysis tools (like Mypy) and IDEs, enabling better autocompletion and type checking.Correctly Optional: The generator now correctly wraps types in
Optional[...]
if their default value isNone
. This applies to strings, vectors, and other nullable fields, ensuring strict type safety.The new approach remains fully backward-compatible, as all arguments have default values. Existing code that uses the empty constructor will continue to work without modification.
Example of a Generated
__init__
Before:
After:
Example of User Code
Before:
After: