News for hackers. Stuff that matters.
Re:Python 3.7: Introducing Data Classes by reaperhulk on Wednesday April 18, 2018 @12:11PM (#16868508)
As noted in the PEP data classes is a less fully-featured stdlib implementation of what attrs already provides. Unless you’re constrained to the stdlib (as those who write CPython itself of course are) you should consider taking a look at attrs first.

http://www.attrs.org/en/stable/

Re:Python 3.7: Introducing Data Classes by shoyer on Wednesday April 18, 2018 @12:43PM (#16868814)
Less fully-featured, sure, but also a bit more cleanly designed (in my opinion). Are there features from attrs that you would miss with dataclasses?
Re:Python 3.7: Introducing Data Classes by metalliqaz on Wednesday April 18, 2018 @01:45PM (#16869320)
This is spot on. The design of attrs remines me a little bit of the syntax from a declarative ORM, for example. I'm sure it can do very powerful things that I've not had occasion to use, but it is heavy. The @dataclass format is very clean and seems more like the syntactic sugar that I expect from Python.

One of the prime uses of a dataclass is to be a mutable namedtuple. And the syntax can be almost identical:

    Part = make_dataclass('Part', ['part_num', 'description', 'quantity'])
(from Raymond Hettinger's twitter)

This has the added benefit of not requiring type hinting, if you don't want to bother with such things.

Re:Python 3.7: Introducing Data Classes by froztbyte on Wednesday April 18, 2018 @02:18PM (#16869628)
in a freshly created venv, with attrs and ipython (and deps, of course):

  (attrs) % ipython
  Python 2.7.14 (default, Oct 19 2017, 23:28:49)
  Type "copyright", "credits" or "license" for more information.
  
  IPython 5.6.0 -- An enhanced Interactive Python.
  ?         -> Introduction and overview of IPython's features.
  %quickref -> Quick reference.
  help      -> Python's own help system.
  object?   -> Details about 'object', use 'object??' for extra details.
  
  In [1]: import attr
  
  In [2]: Part = attr.make_class("Part", ["part_num", "description", "quantity"])
  
  In [3]: Part?
  Init signature: Part(self, part_num, description, quantity)
  Docstring:      <no docstring>
  Type:           type

Outside of the name of the thing that creates the item, the syntax is identical to what you have here.

edit: removed triple backticks, indented with 2sp according to https://news.ycombinator.com/formatdoc rules

Re:Python 3.7: Introducing Data Classes by zackelan on Wednesday April 18, 2018 @12:44PM (#16868826)
attrs also has a feature that dataclasses don't currently [0]: an easy way to use __slots__ [1].

It cuts down on the per-instance memory overhead, for cases where you're creating a ton of these objects. It can be useful even when not memory-constrained, because it will throw AttributeError, rather than succeeding silently, if you make a typo when assigning to an object attribute.

0: https://www.python.org/dev/peps/pep-0557/#support-for-automa...

1: http://www.attrs.org/en/stable/examples.html#slots

Re:Python 3.7: Introducing Data Classes by kstrauser on Wednesday April 18, 2018 @01:33PM (#16869223)
Does that still matter now that PEP 412 (https://www.python.org/dev/peps/pep-0412/) is implemented in Python 3.3 and newer?
Re:Python 3.7: Introducing Data Classes by xapata on Wednesday April 18, 2018 @01:51PM (#16869384)
No, I wouldn't bother with __slots__ in 3.7, especially with the newly optimized dict.
Re:Python 3.7: Introducing Data Classes by markrwilliams on Wednesday April 18, 2018 @09:01PM (#16872578)
PEP 412 makes __dict__s more memory efficient than they were before, but not more efficient than no __dict__, which is the point of __slots__. The following program demonstrates the difference. Note that it lowers the available address space to 1GB so that memory exhaustion occurs sooner, and thus only works on UNIX-like systems that provide the resource module.

  import resource
  import sys

  class WithoutSlots:
      def __init__(self, a, b):
          self.a = a
          self.b = b

  class WithSlots:
      __slots__ = ('a', 'b')
      def __init__(self, a, b):
          self.a = a
          self.b = b

  resource.setrlimit(resource.RLIMIT_AS, (1024 ** 3, 1024 ** 3))
  cls = WithSlots if sys.argv[1:] == ['slots'] else WithoutSlots
  count, instances = 0, []
  while True:
      try:
          instances.append(cls(1, 2))
      except MemoryError:
          break
  count = len(instances)
  del instances
  print(cls, count)

Here are numbers from my laptop:

  $ python3.6 /tmp/slots.py 
  <class '__main__.WithoutSlots'> 5830382
  $ python3.6 /tmp/slots.py slots
  <class '__main__.WithSlots'> 16081964

That's almost 3x more instances with __slots__! This isn't the case with PyPy, though, thanks to a more efficient representation of objects:

https://morepypy.blogspot.com/2010/11/efficiently-implementi...

Re:Python 3.7: Introducing Data Classes by xapata on Wednesday April 18, 2018 @10:27PM (#16872887)
That's a silly example. If you're making billions of integers, use NumPy. If it's just one pass, use a generator. If you're making lots of objects with more interesting attributes, the attribute storage will overwhelm the difference the instance dicts make.

My point was not that __slots__ does nothing, but that there are more important things to worry about.

Re:Python 3.7: Introducing Data Classes by marvy on Wednesday April 18, 2018 @11:04PM (#16873044)
Suppose I want to run algorithms on large arrays of 2D points while maximizing readability. I want to store the x and y coordinates using Python integers so I don't have to worry about overflow errors, but I expect that most of the time the numbers will be small and this is "just in case".

I claim that in this case, __slots__ is exactly the right thing to worry about.

Re:Python 3.7: Introducing Data Classes by xapata on Wednesday April 18, 2018 @11:44PM (#16873174)
It's hard for me to imagine that situation coming up, but yes, __slots__ does indeed have a purpose.

BTW, have you considered using the complex type to handle that for you? It's 2d and ints should be safe in float representation. If it overflows it'll crash nicely.

Re:Python 3.7: Introducing Data Classes by marvy on Thursday April 19, 2018 @11:07PM (#16881895)
Good one. But let's say I want something mutable, so complex won't do.
Re:Python 3.7: Introducing Data Classes by kstrauser on Thursday April 19, 2018 @01:04AM (#16873455)
That's an interesting example, and thanks for demonstrating it with a modern version! I definitely wouldn't have expected that result.
Re:Python 3.7: Introducing Data Classes by adamc on Wednesday April 18, 2018 @01:14PM (#16869055)
Does attrs support type hints? I didn't see it in a quick skim...

One thing the stdlib implementation has going for it: better naming. attr.ib() is not exactly crystal-clear.

Re:Python 3.7: Introducing Data Classes by nicwolff on Wednesday April 18, 2018 @03:53PM (#16870533)
You can `from attr import attrib, attribs` and use those instead of `@attr.s` and `attr.ib()`.
Re:Python 3.7: Introducing Data Classes by hynek on Wednesday April 18, 2018 @01:17PM (#16869099)
Re:Python 3.7: Introducing Data Classes by oblio on Wednesday April 18, 2018 @12:18PM (#16868580)
Re:Python 3.7: Introducing Data Classes by reaperhulk on Wednesday April 18, 2018 @12:20PM (#16868600)
Yep, I’ll add the URL in my comment, sorry about that.