Effective Python Book Club
March 30, 2016: Chapters 1 & 2
Attending
- Cliff Dyer (Deactivated)
- Brian Jacobel (Unlicensed)
- akivaR (Deactivated)
- Brian Wilson (Deactivated)
- Andy Armstrong (Deactivated)
- Renzo Lucioni (Deactivated)
- Ned Batchelder (Deactivated)
- Eric Fischer (Deactivated)
- Nimisha Asthagiri (Deactivated)
- Sandy Student (Deactivated)
Notes
- Item 2:
- double-underscore is not for private variables.
- Item 3:
- How to handle native strings?
- from __future__ import unicode_literal & silence when needed (variable behavior between files (yuck))
- lint native strings
- have coercion functions
- Needs engineering education
- How to handle native strings?
- Item 5: slice
- Is it bad that it is forgiving?
- Sometimes it's useful
- Maybe there should be a failfast version.
- Is it bad that it is forgiving?
- Item 10: enumerate
- Very useful
- Takes initial index! Cool!
- Item 11: zip
- Makes Akiva nervous, because it has weird behavior with different length strings
- zip_longest does the longer one (padding with Nones)
- Item 12:
- Renzo disagrees
- should we avoid else blocks.
- "If a feature is rare and somewhat surprising, you shouldn't use it." – Akiva
- Alternative is good: break loop out into a separate function
- Use with comment to describe behavior.
- Item 14: Avoid None
- not var is a source of bugs because None and 0 are both false
- It's fairly useful for containers (lists, dicts, strings, etc.)
- Item 15: Closures
- Accessing non-locals: create a class
- Use nonlocals as read only
- Item 16: consider generators instead of lists
- small lists are fine
- generators can be problematic. See Item 17.
- we don't do much of this
- generators are awesome
- custom containers are awesomer
- Item 17: be defensive when iterating over sequences twice.
- iter(foo) is iter(foo)
- different from iter(foo) is foo?
- convert to list if you hit this kind of error and don't want to refactor into a custom container.
- iter(foo) is iter(foo)
- Item 21: keyword only args
- Nimisha does not recommend using **kwargs to enforce keyword-only args, because it makes the code ugly and hard to read
- Sometimes it's useful anyway
- Nimisha does not recommend using **kwargs to enforce keyword-only args, because it makes the code ugly and hard to read
Not Discussed
- Item 1: Know which version of Python you're using
- Item 4: Write helper functions instead of complex expressions
- Item 6: avoid using start, end, and stride in a single slice
- I think we did discuss this, at least obliquely. I didn't capture notes.
- Item 7: Use list comprehensions instead of map and filter
- Item 8: Avoid more than two expressions in list comprehensions
- Item 9: Consider generator expressions for large comprehensions
- Item 13: Take advantage of each block in try/except/else/finally
- Item 18: Reduce visual noise with variable positional arguments
- Item 19: Provide optional behavior with keyword arguments
- Item 20: Use None and docstrings to specify dynamic default arguments
April 6, 2016 Notes: Chapter 3
Attending
Cliff Dyer (Deactivated) Eric Fischer (Deactivated)
Notes:
- Item 26: Mixins
- Good to see practice formalized
- No __init__ was a new practice for us. Would add cleanliness to some code.
- Item 28: collections.abc
- Fluently pythonic objects are great. We should do more of them. This makes it easy.
April 20, 2016 Notes: Chapter 5
Attending
Cliff Dyer (Deactivated) Eric Fischer (Deactivated) Ned Batchelder (Deactivated) Renzo Lucioni (Deactivated) Michael Katz (Deactivated) Nimisha Asthagiri (Deactivated) akivaR (Deactivated)
Notes
- Coroutines: Confusing example. What is the benefit?
- Separates dumb client and smart server
- Probably not the kind of thing we want to write in edX production code (probably)
- concurrent.futures
- Allows you to send data in chunks
- When to use threads vs. concurrent.futures:
- lower level – to implement different patterns of work.
- subprocess doesn't let you interact with the called process. Use pyexpect ( ?)
- subprocess creates two threads to deal with I&O,
- LMS Grading has a five day timeout before getting hard-killed.
- This should be parallelizable.
April 27, 2016 Notes: Chapter 6
Attending: Eric Fischer (Deactivated) akivaR (Deactivated) Ned Batchelder (Deactivated) Sandy Student (Deactivated)
Notes
- Fairly uncontroversial overall, good to know how these modules work
- Addition from Ned: don't forget that __exit__() has a chance to look at thrown exception, it's not just a finally (self.assertRaises in unit tests)
- Would have been nice to see an example of PyPI utilities, like https://pypi.python.org/pypi/arrow
May 4, 2016 Notes: Chapter 7 Collaboration
Attending: Eric Fischer (Deactivated) Renzo Lucioni (Deactivated) Cliff Dyer (Deactivated)
Notes:
- None taken
May 4, 2016 Notes: Chapter 7 Collaboration
Attending: Cliff Dyer (Deactivated) Sandy Student (Deactivated) Eric Fischer (Deactivated) Michael Katz (Deactivated)
Notes:
- Use a debugger (like pdb, Item 57). Scott says so.
- There are pdb alternatives rpdb, pydb, etc. that do remote debugging.
- reprs are handy. Create them when you need them, and include in your commit.
- Profiling: Is there a graphical profiler? SnakeViz seems to be the thing.