-
Notifications
You must be signed in to change notification settings - Fork 257
NamedTupleInterface #431
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
Comments
Sorry, but it is still not clear what exactly do you need. If you just want to annotate a function parameter so that arbitrary named tuple can be passed there, then this will be solved by protocols, see #417 and PEP 544 (there are links to implementations for T = TypeVar('T', bound='NamedTupleProto')
class NamedTupleProto(Protocol):
_source: str
_fields: Tuple[str]
def _asdict(self) -> Dict[str, Any]: ...
@classmethod
def _make(cls: Type[T], iterable: Iterable[Any], *,
new: Any = None, len: int = None) -> T: ...
def __getitem__(self, item: int) -> Any: ...
def f(arg: NamedTupleProto) -> Dict[str, Any]:
arg[0]
return arg._asdict()
class A(NamedTuple):
a: int
class B(NamedTuple):
b: int
x: A
y: B
f(x) # OK
f(y) # OK If you need only some part of the named tuple API, you could define a much simpler protocol. EDIT: If you need the full named tuple API, then |
Is there a workaround we can use before that PEP is ready? Or is Any the
closest we can get without protocols?
…On May 16, 2017 2:30 AM, "Ivan Levkivskyi" ***@***.***> wrote:
Sorry, but it is still not clear what exactly do you need. If you just
want to annotate a function parameter so that arbitrary named tuple can be
passed there, then this will be solved by protocols, see #417
<#417> and PEP 544 (there are links
to implementations for mypy and typeshed). For example something like
this:
T = TypeVar('T', bound='NamedTupleProto')
class NamedTupleProto(Protocol):
_source: str
_fields: Tuple[str]
def _asdict(self) -> Dict[str, Any]: ...
@classmethod
def _make(cls: Type[T], iterable: Iterable[Any], *,
new: Any = None, len: int = None) -> T: ...
def __getitem__(self, item: int) -> Any: ...
def f(arg: NamedTupleProto) -> Dict[str, Any]:
arg[0]
return arg._asdict()
class A(NamedTuple):
a: intclass B(NamedTuple):
b: int
x: A
y: B
f(x) # OK
f(y) # OK
If you need only some part of the named tuple API, you could define a much
simpler protocol.
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
<#431 (comment)>, or mute
the thread
<https://github.com/notifications/unsubscribe-auth/ACwrMgybTgGVUKtr_8lDkkZ7ad4hV5Fvks5r6Wy7gaJpZM4NbwsB>
.
|
I fear we are comparing an elephant and an ant here.. Anyway to require an user to define an implicit protocol to describe a core library interface does not make a lot of sense. At the moment I use various workarounds depending on the project, like creating the ABC myself and register my namedtuples manually, or use Any. What I want to archive is not hard conceptually, NamedTupleType would be used exactly like typing.Tuple, but exposing the NamedTuple API as well. Out of the obvious it would also be a nice place to document namedtuples API incode, and it would probably make the life easier to code checker when accessing namedtuples' public methods . |
OK, submit a PR and maybe we'll merge it. |
Note that implementing this in In any case, as Guido mentioned, PRs are welcome. |
Okey dokey, I'll work on it during the weekend :) |
@ilevkivskyi It may make sense to have @zauddelig If something like |
Probably. TBH I just picked some random attributes to illustrate the idea, but I rather think this is not the case where "one size fits all". At least it is not completely clear to me what is the "named tuple API". |
I think there are at least three users until now who were surprised by this, see also python/mypy#3915. I think especially because in 3.6 NamedTuples have this nice class syntax. It then really looks like class and so it is surprising that one cannot just use it as a type. |
How can one access the |
If this issue is still open, I think it should be reported to bugs.python.org. |
Related unmerged It allows to write: def deserialize_named_tuple(arg: NamedTuple) -> Dict[str, Any]:
return arg._asdict()
Point = namedtuple('Point', ['x', 'y'])
Person = NamedTuple('Person', [('name', str), ('age', int)])
deserialize_named_tuple(Point(x=1, y=2)) # ok
deserialize_named_tuple(Person(name='Nikita', age=18)) # ok
deserialize_named_tuple((1, 2))
# Argument 1 to "deserialize_named_tuple" has incompatible type "Tuple[int, int]"; expected "NamedTuple" Friendly ping to @JukkaL and @ilevkivskyi 😉 |
Hello, I already wrote on python-ideas group, I frequently am in need to have abstract access to the NamedTuple API, here a very simple exapmple:
At the moment I have two hotfix:
Overload the namedtuple factory, but somewhat breaking my IDE or creating a fake namedtuple but both of them are hacks.
If my proposal get accepted I'm willingly to do the coding part :)
Thanks
The text was updated successfully, but these errors were encountered: