Repository: PyGithub/PyGithub

Issue:
More precise typing on `Github.get_user()`
In `MainClass.pyi` the `get_user` method is typed as such:
```py
    def get_user(
        self, login: Union[str, _NotSetType] = ...
    ) -> Union[AuthenticatedUser, NamedUser]: ...
```

But I took a look at the implementation and I think the returned type can be better by using [function overloading](https://mypy.readthedocs.io/en/stable/more_types.html#function-overloading):
```py
from typing import overload
...

    @overload
    def get_user(self, login: str
    ) -> NamedUser: ...
    @overload
    def get_user(
        self, login: _NotSetType = ...
    ) -> AuthenticatedUser: ...
    def get_user(
        self, login: Union[str, _NotSetType] = ...
    ) -> Union[AuthenticatedUser, NamedUser]: ...
```

That way if you call it with a `login` mypy knows it returns a `NamedUser`, and if you call without the `login` argument it returns an `AuthenticatedUser`.

Note: this is my current use case but I didn't check to see if other methods could be improved like this.
Should I create a PR with this already and see about the rest later on?


Discussion:
Also just found out that the `:rclass:` docstring doesn't specify `AuthenticatedUser` as a possible return value
Based on my reading of the docs of function overloading we only need the first two, but this looks amazing! Are you happy with pushing up a PR for this?

Resolving patch:
diff --git a/github/MainClass.py b/github/MainClass.py
--- a/github/MainClass.py
+++ b/github/MainClass.py
@@ -257,7 +257,7 @@ def get_user(self, login=github.GithubObject.NotSet):
         """
         :calls: `GET /users/:user <http://developer.github.com/v3/users>`_ or `GET /user <http://developer.github.com/v3/users>`_
         :param login: string
-        :rtype: :class:`github.NamedUser.NamedUser`
+        :rtype: :class:`github.NamedUser.NamedUser` or :class:`github.AuthenticatedUser.AuthenticatedUser`
         """
         assert login is github.GithubObject.NotSet or isinstance(login, str), login
         if login is github.GithubObject.NotSet:
diff --git a/github/ProjectColumn.py b/github/ProjectColumn.py
--- a/github/ProjectColumn.py
+++ b/github/ProjectColumn.py
@@ -126,6 +126,7 @@ def create_card(
         :param note: string
         :param content_id: integer
         :param content_type: string
+
         :rtype :class:`github.ProjectCard.ProjectCard`:
         """
         if isinstance(note, str):
@@ -150,6 +151,7 @@ def move(self, position):
         """
         :calls: `POST POST /projects/columns/:column_id/moves <https://developer.github.com/v3/projects/columns/#move-a-project-column>`_
         :param position: string
+
         :rtype: bool
         """
         assert isinstance(position, str), position
@@ -164,7 +166,7 @@ def move(self, position):
 
     def delete(self):
         """
-        :calls: `DELETE /projects/columns/:column_id <https://developer.github.com/v3/projects/columns/#delete-a-project-column`_
+        :calls: `DELETE /projects/columns/:column_id <https://developer.github.com/v3/projects/columns/#delete-a-project-column>`_
         :rtype: bool
         """
         status, _, _ = self._requester.requestJson(
diff --git a/github/Repository.py b/github/Repository.py
--- a/github/Repository.py
+++ b/github/Repository.py
@@ -2924,7 +2924,7 @@ def get_tags(self):
 
     def get_releases(self):
         """
-        :calls: `GET /repos/:owner/:repo/releases <https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository`_
+        :calls: `GET /repos/:owner/:repo/releases <https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository>`_
         :rtype: :class:`github.PaginatedList.PaginatedList` of :class:`github.GitRelease.GitRelease`
         """
         return github.PaginatedList.PaginatedList(


Test patch: