Skip to content
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

In itertools.chain.from_iterable() there is no cls argument #62501

Closed
py-user mannequin opened this issue Jun 25, 2013 · 11 comments
Closed

In itertools.chain.from_iterable() there is no cls argument #62501

py-user mannequin opened this issue Jun 25, 2013 · 11 comments
Assignees
Labels
docs Documentation in the Doc dir type-feature A feature request or enhancement

Comments

@py-user
Copy link
Mannequin

py-user mannequin commented Jun 25, 2013

BPO 18301
Nosy @rhettinger, @terryjreedy, @ezio-melotti, @bitdancer, @py-user, @serhiy-storchaka
Files
  • issue18301.diff
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = 'https://github.com/rhettinger'
    closed_at = <Date 2013-09-09.06:57:17.906>
    created_at = <Date 2013-06-25.18:58:43.184>
    labels = ['type-feature', 'docs']
    title = 'In itertools.chain.from_iterable() there is no cls argument'
    updated_at = <Date 2013-09-09.06:57:17.905>
    user = 'https://github.com/py-user'

    bugs.python.org fields:

    activity = <Date 2013-09-09.06:57:17.905>
    actor = 'rhettinger'
    assignee = 'rhettinger'
    closed = True
    closed_date = <Date 2013-09-09.06:57:17.906>
    closer = 'rhettinger'
    components = ['Documentation']
    creation = <Date 2013-06-25.18:58:43.184>
    creator = 'py.user'
    dependencies = []
    files = ['30702']
    hgrepos = []
    issue_num = 18301
    keywords = ['patch']
    message_count = 11.0
    messages = ['191874', '191875', '191884', '192009', '192015', '194535', '194668', '194701', '194712', '195291', '197352']
    nosy_count = 8.0
    nosy_names = ['rhettinger', 'terry.reedy', 'ezio.melotti', 'r.david.murray', 'docs@python', 'py.user', 'python-dev', 'serhiy.storchaka']
    pr_nums = []
    priority = 'normal'
    resolution = 'fixed'
    stage = 'commit review'
    status = 'closed'
    superseder = None
    type = 'enhancement'
    url = 'https://bugs.python.org/issue18301'
    versions = ['Python 3.3', 'Python 3.4']

    @py-user
    Copy link
    Mannequin Author

    py-user mannequin commented Jun 25, 2013

    http://docs.python.org/2/library/itertools.html#itertools.chain.from_iterable

    >>> class A:
    ...   @classmethod
    ...   def from_iterable(iterables):
    ...     for it in iterables:
    ...       for element in it:
    ...         yield element
    ... 
    >>> A.from_iterable(['ABC', 'DEF'])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: from_iterable() takes 1 positional argument but 2 were given
    >>>

    @py-user py-user mannequin assigned docspython Jun 25, 2013
    @py-user py-user mannequin added docs Documentation in the Doc dir type-feature A feature request or enhancement labels Jun 25, 2013
    @py-user
    Copy link
    Mannequin Author

    py-user mannequin commented Jun 25, 2013

    @bitdancer
    Copy link
    Member

    It is implemented as a classmethod, but the "equivalent" code doesn't need to be part of the class all. I'm not sure what should be done here (say @staticmethod? Leave the decorator off?). We should probably see what Raymond thinks. I lean toward the latter, that's the way it is in the python2 docs, and it doesn't seem to have caused any confusion.

    @terryjreedy
    Copy link
    Member

    The 2.7 doc says 'Roughly equivalent to' rather than 'Equivalent to'.
    The undecorated Python version of from_iterable actually works as an attribute of the Python version of chain: chain.from_iterable = from_iterable. I would just remove the decorator. The entire itertools doc exploits that fact that generator functions are analogous to classes, but it does not work to mix the two in the way that the 3.x chain entry does.

    @serhiy-storchaka
    Copy link
    Member

    Perhaps it should be staticmethod, not classmethod.

    @serhiy-storchaka
    Copy link
    Member

    It should be a classmethod.

    >>> import itertools
    >>> class C(itertools.chain): pass
    ... 
    >>> type(C.from_iterable(['ab', 'cd']))
    <class '__main__.C'>

    The patch LGTM.

    @ezio-melotti
    Copy link
    Member

    I would just remove the decorator.

    +1

    @py-user
    Copy link
    Mannequin Author

    py-user mannequin commented Aug 8, 2013

    >>> import itertools
    >>> 
    >>> class A(itertools.chain):
    ...     def from_iter(arg):
    ...         return A(iter(arg))
    ... 
    >>> class B(A):
    ...     pass
    ... 
    >>> B('a', 'b')
    <__main__.B object at 0x7f40116d7730>
    >>> B.from_iter(['a', 'b'])
    <__main__.A object at 0x7f40116d7780>
    >>>

    it should be B

    @py-user
    Copy link
    Mannequin Author

    py-user mannequin commented Aug 9, 2013

    changed iter(arg) to *arg

    >>> import itertools
    >>> 
    >>> class A(itertools.chain):
    ...     @classmethod
    ...     def from_iter(cls, arg):
    ...         return cls(*arg)
    ... 
    >>> class B(A):
    ...     pass
    ... 
    >>> B('ab', 'cd')
    <__main__.B object at 0x7fc280e93cd0>
    >>> b = B.from_iter(['ab', 'cd'])
    >>> b
    <__main__.B object at 0x7fc280e93d20>
    >>> next(b)
    'a'
    >>> next(b)
    'b'
    >>> next(b)
    'c'
    >>> next(b)
    'd'
    >>> next(b)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    >>>

    @terryjreedy
    Copy link
    Member

    My counter proposal bpo-18752 is that chain.from_iterable become a deprecated alias for a new function, chain_iterable. With '@classmethod' removed, the current Python equivalent would work for chain_iterable.

    @python-dev
    Copy link
    Mannequin

    python-dev mannequin commented Sep 9, 2013

    New changeset 29fa1f418796 by Raymond Hettinger in branch '3.3':
    bpo-18301: The classmethod decorator didn't fit well with the rough-equivalent example code.
    http://hg.python.org/cpython/rev/29fa1f418796

    @ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    docs Documentation in the Doc dir type-feature A feature request or enhancement
    Projects
    None yet
    Development

    No branches or pull requests

    5 participants