PyFunctional icon indicating copy to clipboard operation
PyFunctional copied to clipboard

Adding type hinting in the code.

Open nmiculinic opened this issue 7 years ago • 16 comments

https://docs.python.org/3/library/typing.html

This way python autocomplete engines work better when the function types are known. It would be a considerable improvement in this library since code can be type checked before running it, not to mention improved auto-complete correctness.

nmiculinic avatar Dec 14 '17 14:12 nmiculinic

https://www.python.org/dev/peps/pep-0484/#stub-files

For compatibility with python2 and 3

nmiculinic avatar Dec 14 '17 14:12 nmiculinic

Agreed, this would be a great addition. I unfortunately don't have time to add it myself, but I would welcome/review a PR!

EntilZha avatar Dec 14 '17 17:12 EntilZha

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

stale[bot] avatar Jul 09 '20 22:07 stale[bot]

Is anyone working on this?

weditor avatar Aug 17 '21 07:08 weditor

@weditor not that I know of, but I'd still welcome a PR for it. Now that the project only supports python 3.6.1 and up, it's possible to do this with native type hints in code instead of a stub file. Are you interested in doing a first pass perhaps?

EntilZha avatar Aug 17 '21 14:08 EntilZha

yes, I'm interested in it. but...should I add type hints to original code? it may be a more secure approach to add *.pyi file, in the same directory of .py files ?

link: https://mypy.readthedocs.io/en/stable/stubs.html#creating-a-stub

In this case, we still don't have to maintain an extra pyfunctional-stubs library 。

it seems works well with mypy and IDEs 。

weditor avatar Aug 18 '21 01:08 weditor

@weditor sounds great! I would prefer to have type hints to the source code itself, so inside the python files. When this issue was first created, pyfunctional still supported pre 3.5 python, which made supporting type hints difficult (had to be through stub files for compatibility). Now that we support only 3.6 and higher, the type hint features are available in all supported python versions.

EG, https://github.com/EntilZha/PyFunctional/blob/master/functional/pipeline.py#L386 would be def drop_right(self, n: int)

EntilZha avatar Aug 18 '21 01:08 EntilZha

hello, i submitted a PR. unittests are passed. but coverage declined, Because there are many @overload functions, their body are empty ... . there is also some plint errors, most of them are false positives. i will fix isort error later

weditor avatar Aug 18 '21 13:08 weditor

It's fine if coverage goes down where reasonable, all the other checks should pass though. The other thing that would be great is to have a way to verify that the types seem correct. For example, it might be worth adding some mypy or other type checker on the unit test directory to make sure the unit tests type check correctly

EntilZha avatar Aug 18 '21 17:08 EntilZha

Any news on type hints? It is a super-useful feature for people like me who want to check generic collections with static types.

antonkulaga avatar Feb 07 '22 00:02 antonkulaga

Commented on the associated PR https://github.com/EntilZha/PyFunctional/pull/162. TLDR: I'd merge that PR if either (1) it added mypy static type checking as a lint step or (2) another PR added only this + I rebase the new PR ontop of it to check the linting type check.

EntilZha avatar Feb 07 '22 18:02 EntilZha

sorry for late reply. I'm trying mypy these days. but there's a problem about typing.overload, for example

@overload
def head_option(self: "Sequence[Iterable[_T1]]") -> Optional["Sequence[_T1]"]:
    ...

@overload
def head_option(self: "Sequence[_T2]") -> Optional[_T2]:
    ...

head_option will return the first element in sequence. when the returned element is also an iterable, it will be wrapped to another Sequence object.

But this will cause mypy to report an error: Overloaded function signatures 1 and 2 overlap with incompatible return types[misc]. because Optional[T] is superset of Optional[Sequence[T]].

unfortunately, there are many @overloads here. It seems mypy will search all signature concurrently, then return all that maches. In many IDEs, they picks the first one that matches (this is what I expect). so these overload works well in vscode/pycharm.

I cannot find any way to fix this expect --disable-error-code misc.

here's some discussion about it: python/mypy#1941, python/typing#253

weditor avatar May 27 '22 02:05 weditor

Uhm, any updates so far?

mbatra-hunter avatar May 09 '23 15:05 mbatra-hunter

I haven't/won't have time to work on it personally, but am generally supportive of PRs. The fastest way to get something merged is (1) comment with general plan, in case I'd want it done differently (2) add CI tests for new things and (3) add the new changes. Since the typing changes add quite a lot of code, I'd really want to have this checked by CI. So as my prior comment, I think a reasonable step of doing this would be to first add a PR to add CI type checking, then a second PR that starts adding types that are needed. For the last step, I'd strongly recommend doing this incrementally, eg, just add basic types first rather than everything at once (e.g., Sequence[Any] instead of something more complicated).

EntilZha avatar May 16 '23 16:05 EntilZha

Hi there! I see that progress was made on type hinting as several pull requests have been merged. Any chance we can have a new release with the new features? The last release is 1.4.3 over three years ago. Thanks :-)

jbq avatar Mar 13 '24 12:03 jbq