Hi,

Thanks for starting this discussion. +1 for the proposal and Timo's
addendum regarding the deprecation warning.

Best,
Ferenc


On Thursday, February 20th, 2025 at 11:30, Timo Walther <twal...@apache.org> 
wrote:

> 
> 
> Hi Mika,
> 
> thanks for bringing this up! I was actually quite surprised that we
> don't use any kind of marking in our interfaces in the Python API yet.
> 
> Your proposal makes total sense. We should reuse the same annotation
> categories that we use and agreed on in Java. Since the Python Table API
> is a thin layer around the Java one, we should use the same stability
> annotations corresponding to each method.
> 
> > The only real wrinkle is that the @Deprecated annotation in Java
> 
> > outputs a warning at compile time if it is used, whereas Python
> 
> > doesn't have a compile time. A warning could be emitted at runtime on
> 
> > function use, for example, but I'm not entirely sure how nice that
> 
> > would be.
> 
> 
> I think printing a warning at runtime is fine as long as the "runtime"
> is not the Flink runtime but Flink's pre-flight / pre-cluster phase. So
> maybe we should avoid deprecations within UDFs. But deprecating
> functions that construct the Table API program, and are not on the hot
> (i.e. per record) path, should be fine.
> 
> +1 to this effort. Personally, I don't think we need a FLIP. We
> basically make the Python API consistent with previous FLIPs around API
> stability. Also, we bring consistency between Java and Python.
> 
> What do others think?
> 
> Thanks,
> Timo
> 
> 
> On 19.02.25 15:31, Mika Naylor wrote:
> 
> > Hi everyone,
> > 
> > I'd like to start a discussion about adding API stability annotations to 
> > PyFlink, similar to those currently used in the Java APIs (@PublicEvolving, 
> > @Experimental, etc.).
> > 
> > Currently, the Java APIs use annotations like @PublicEvolving and 
> > @Experimental to clearly indicate the stability status of API components. 
> > This is super helpful for understanding which parts of the API are stable 
> > for production use and which might change in future releases.
> > 
> > The Python APIs lack this kind of explicit stability indication. It's 
> > possible to add a `deprecated` directive to the class/function docstrings 
> > to produce a deprecated warning in the API documentation, but it's not 
> > widely used.
> > 
> > I would like to port the API stability annotations from the Java project 
> > into Python equivalents as decorators for Python classes/functions, and to 
> > align the stability annotations between the Java and Python APIs. These 
> > decorators would enrich the docstrings of the underlying classes/functions 
> > to output consistent sections in the API documentation describing the 
> > stability of the class/function as PublicEvolving, Experimental, 
> > Deprecated, etc. For example:
> > 
> > Example usage:
> > ```python
> > 
> > @PublicEvolving()
> > class Table(object):
> > ...
> > 
> > @Deprecated(since="2.1.0", detail="Use :func:`Table.get_resolved_schema` 
> > instead.")
> > def get_schema(self) -> TableSchema:
> > ...
> > ```
> > 
> > Would output in the API documentation a notice that the Table class' 
> > interface is public but evolving, and that `get_schema` is deprecated since 
> > 2.1.0 in favour of `get_resolved_schema`.
> > 
> > The only real wrinkle is that the @Deprecated annotation in Java outputs a 
> > warning at compile time if it is used, whereas Python doesn't have a 
> > compile time. A warning could be emitted at runtime on function use, for 
> > example, but I'm not entirely sure how nice that would be.
> > 
> > Thanks for reading! I would love any opinions/feedback on whether this 
> > would be useful to developers currently using the Python APIs.
> > 
> > Thanks,
> > Mika

Reply via email to