PyCon 2019
Talks
Getting to Three Million Lines of Type-Annotated Python
Dropbox is a heavy user of the mypy type checker, recently passing three million lines of type-annotated Python code, with over half of that added in 2018. Type checking is helping find bugs, making code easier to under stand, enabling refactors, ...
Michael Sullivan
Python
Measuring Model Fairness
When machine learning models make decisions that affect people’s lives, how can you be sure those decisions are fair? When you build a machine learning product, how can you be sure your product isn't biased? What does it even mean for an algorithm...
J. Henry Hinnefeld
Python
The Elephant and the Serpent: Using Mastodon with Python
For the past two years, an Open Source social network has been building on the foundations laid by years of Open Web work and quietly growing to provide a viable alternative to the social network megacorps we’ve grown used to. It’s name is Mastodo...
Philip James
Python
Floats are Friends: making the most of IEEE754.00000000000000002
Floating point numbers have been given a bad rap. They're mocked, maligned, and feared; the but of every joke, the scapegoat for every rounding error. But this stigma is not deserved. Floats are friends! Friends that have been stuck between a r...
David Wolever
Python
Shipping your first Python package and automating future publishing
One of the best things about Python is the vast ecosystem of packages available on the Python Package Index. Shipping your first Python package can be intimidating. This talk aims to remove the mystery of Python packaging and enable you to share y...
Chris Wilcox
Python
Break the Cycle: Three excellent Python tools to automate repetitive tasks
Find yourself doing the same thing over and over again? Does it take more than one command to run your tests? build your docs? publish your project? deploy? It is often difficult to share your code because others can run or test it? Does your R...
Thea Flowers
Python
Making Music with Python, SuperCollider and FoxDot
Learn how to make music with Python, SuperCollider and FoxDot. We'll create a song together in this live coded adventure. Slides can be found at: https://speakerdeck.com/pycon2019 and https://github.com/PyCon/2019-slides
Jessica Garson
Python
Syntax Trees and Python - Automated Code Transformations
Manually updating a million line code base is tedious. Thankfully syntax trees provide a safe and quick way to automatically apply repetitive transformations. Leveraging syntax tree based tooling (based on lib2to3), has been a critical component ...
Joe Gordon
Python
How to Think about Data Visualization
The Python world has a staggering array of data visualization tools, and choosing which to use can seem like a daunting task. But which tool you use is far less important than how you use it. In this talk I’ll walk through some of the important co...
Jake VanderPlas
Python
Thinking Inside the Box: How Python Helped Us Adapt to An Existing Data Ingestion Pipeline
We will cover how we used Python to adapt to a large institutional processing setup. We used Python to create the definitions, configuration files, and supplementary metadata for each of the weather radars we worked with. We used a variety of cu...
Eddie Schuman
Python
Fighting Climate Change with Python
Methane, the primary component of natural gas, is a 60 times more powerful climate change agent than carbon dioxide. Current technologies for finding methane leaks in oil and gas infrastructure rely on driving well to well with a handheld camera....
Matthew Gordon
Python
8 things that happen at the dot: Attribute Access & Descriptors
We rarely think about the dot “.” between our objects and their fields, but there are quite a lot of things that happen every time we use one in Python. This talk will explore the details of what happens, how the descriptor protocol works, and how...
Andy Fundinger
Python
Account Security Patterns: How Logged-In Are you?
Speakers: Philip James, Asheesh Laroia Account security means making sure your users are only ones who can access their accounts. Account takeovers happen for a variety of reasons -- password re-use, compromised computers, guessable passwords, ...
Philip James, Asheesh Laroia
Python
What is a PLC and how do I talk Python to it?
Walk into any factory and you will see a Programmable Logic Controller (PLC). It's the small box that has a memory card and an Ethernet cable on one side, and lots of colorful wires connected to the other end. Inside runs the logic that turns inpu...
Jonas Neubert
Python
Building a Culture of Observability
Observability is often thought of as just a new word for monitoring. While it encompasses traditional devops areas such as monitoring, metrics, and infrastructure management, it’s much deeper and empowers developers at all levels of the stack. **O...
Alex Landau
Python
How to Build a Clinical Diagnostic Model in Python
Diagnosing a patient requires consideration of a wide variety of factors: past medical history and comorbidities, physical exam findings, lab results, imaging, ECG findings, and in some cases, genomic testing. Clinical diagnosis and prognostic ass...
Jill Cates
Python
Understanding Python’s Debugging Internals
Knowing your enemies is as important as knowing your friends. Understanding your debugger is a little of both. Have you ever wondered how Python debugging looks on the inside? On our journey to building a Python debugger, we learned a lot about i...
Liran Haimovitch
Python
Modern solvers: Problems well-defined are problems solved
Every programmer should learn to use solvers, tools that reason directly from a description of a problem to its solution. Tools like AlphaZero can formulate winning strategies for games given only a description of the rules of the game. For ...
Raymond Hettinger
Python
Don't be a robot, build the bot
Managing a large open source project like CPython is no easy task. Learn how the Python core team automated their GitHub workflow with bots, making it easier for maintainers and contributors to collaborate together. Even if you’re not managing a l...
Mariatta Wijaya
Python
Intentional Deployment: Best Practices for Feature Flag Management
Feature flags can be powerful tools in mitigating risk in your development cycle — _if you use them correctly_. Failing to do so can have enormous consequences for yourself and your business. In 2012 one improperly deployed...
Caitlin Rubin
Python
Dependency hell: a library author's guide
Python is known for its ""batteries included"" philosophy but no Python developer can live without the language's rich library ecosystem. Unfortunately, as the number of libraries increases, so does the risk of cross-library incompatibilities, or ...
Brian Quinlan, Yanhui Li
Python
Attracting the Invisible Contributors
Many new coders seek out open source projects, intending to contribute, and then get overwhelmed and leave. Project maintainers often want the help, but don’t realize how they are inadvertently appearing unwelcoming. I will discuss some of the mos...
Charlotte Mays
Python
Wily Python: Writing simpler and more maintainable Python
Everyone starts with the best intentions with their Python projects, ""this time it's going to be clean, simple and maintainable"". But code evolves over time, requirements change and codebases can get messy and complicated quickly. In this tal...
Anthony Shaw
Python
Does remote work really work?
With nearly nine years of experience as a remote employee across three different companies, Lauren knows the ups and downs of remote work. In this session, Lauren will dive into what the research says about remote work and share her personal stori...
Lauren Schaefer
Python
How to engage Python contributors in the long term? Tech is easy, people are hard.
The CPython project is now 28 years old. It has active core developers, but almost all of them are volunteers. It's difficult to ask someone to be committed into a project for 5 years without being paid. Helping newcomers and mentoring contributor...
Victor Stinner
Python
Statistical Profiling (and other fun with the sys module)
Profiling involves computing a set of data about how often and how long various parts of your program are executed. Profiling is useful to understand what makes your program slow and how you can improve it. After a quick review of deterministic...
Emin Martinian
Python
Help! I'm now the leader of our Meetup group!
After attending your local dev meetup for months, you suddenly get the dreaded email: ""Your Organizer just stepped down without nominating a replacement." But the community relies on this meetup! It brings together devs from all around to enga...
Faris Chebib
Python
Extracting tabular data from PDFs with Camelot & Excalibur
Extracting tables from PDFs is hard. The Portable Document Format was not designed for tabular data. Sadly, a lot of open data is shared as PDFs and getting tables out for analysis is a pain. A simple copy-and-paste from a PDF into a text file or ...
Vinayak Mehta
Python
Time to take out the rubbish: garbage collector
One of the reasons why programming in Python is very straightforward and simple is that we do not have to worry about the lifetime of our objects. That is, once it ceases to be necessary, a variable disappears from the memory ""magically"". The fa...
Pablo Galindo Salgado
Python
Lowering the Stakes of Failure with Pre-mortems and Post-mortems
Failure can be scary. There are real costs to a company and its users when software crashes, models are inaccurate, or when systems go down. The emotional stakes feel high-- no one wants to be responsible for a failure. We can lower the stakes by ...
Liz Sander
Python
Escape from auto-manual testing with Hypothesis!
If we knew all of the bugs we needed to write tests for, wouldn't we just... not write the bugs? So how can testing find bugs that nobody would think of? The answer is to have a computer *write your tests for you!* You declare what kind of in...
Zac Hatfield-Dodds
Python
Testing
How to JIT: Writing a Python JIT from scratch in pure Python
Have you ever wondered how a JIT compiler works? Production quality JIT compilers are large, complicated pieces of software that can seem inscrutable at first glance. However, building a simple JIT compiler is surprisingly easy. We'll walk throug...
Matthew Page
Python
Python on Windows is Okay, Actually
Packages that won't install, encodings that don't work, installers that ask too many questions, and having to own a PC are all great reasons to just ignore Windows. Or they would be, if they were true. Despite community perception, more than ha...
Steve Dower
Python
Strategies for testing Async code
Testing code is important. Testing, primarily unit-testing async code requires heading off the the standard roadway of unit testing in python. This talk will provide a map to help you along the new path towards testing async code. Topics inclu...
Neil Chazin
Python
Testing
to GIL or not to GIL: the Future of Multi-Core (C)Python
Why come to yet another talk about CPython's GIL? [1] Sure, we'll spend a little time on what it is, who it affects (and doesn't), and how to work around it. However, what you want to come hear is what the future holds for the GIL. We'll take...
Eric Snow
Python
Python Security Tools
While high-level security concepts may transcend languages, each language has its own sets of tools and edge cases that are worth knowing. Python is one of many popular languages that is rarely the focus in security training, but that doesn't mea...
Terri Oda
Python
Terrain, Art, Python and LiDAR
Seeing the Earth from above is truly breathtaking, but it takes a lot of time, fuel and opportunity - so instead, why not make miniature art of the world's famous terrains? This talk explores using Python to take raw terrain data - from aerial ...
Andrew Godwin
Python
Supporting Engineers with Mental Health Issues
People live with mental health stigma because we learn that we're supposed to be strong and resilient. It's okay not to be strong or resilient all the time. Discussing mental illness is uncomfortable. In this talk, I will help you overcome that di...
Jenna Quindica
Python
Plugins: Adding Flexibility to Your Apps
Python is a flexible language. Your Python app, on the other hand, is usually more set in stone: buttons, functions, displays are all explicitly defined. In this talk you'll learn how to take advantage of features like decorators and functions ...
Geir Arne Hjelle
Python
Things I Wish They Told Me About The Multiprocessing Module in Python 3
If you haven't tried multiprocessing or you are trying to move beyond `multiprocessing.map()`, you will likely find that using Python's `multiprocessing` module can get quite intricate and convoluted. This talk focuses on a few techniques (starti...
Pamela McANulty
Python
Programmatic Notebooks with papermill
Notebooks have traditionally been a tool for drafting code and avoiding repeated expensive computations while exploring solutions. However, with new tools like nteract's papermill and scrapbook libraries, this technology has been expanded to make ...
Matthew Seal
Python
A Snake in the Bits: Security Automation with Python
Speakers: Moses Schwartz, Andy Culler Security incident response is an intense, high stress, high skill job that relies heavily on human judgement. Despite that, for reasons that we can't begin to understand, a big part of an incident responder...
Moses Schwartz, Andy Culler
Python
Plug-n-Stream Player Piano: Signal Processing With Python
Digital Signal Processing and Player Piano don't normally come together in the same sentance. Player Pianos that are 100+ years old are awesome artisan artifacts, but they don't play digital formats very well. This talk will show how we take a 100...
JP Bader
Python
CUDA in your Python: Effective Parallel Programming on the GPU
It’s 2019, and Moore’s Law is dead. CPU performance is plateauing, but GPUs provide a chance for continued hardware performance gains, if you can structure your programs to make good use of them. CUDA is a platform developed by Nvidia for GPGPU...
William Horton
Python
From days to minutes, from minutes to milliseconds with SQLAlchemy
Object Relational Mappers (ORMs) are awesome enhancers of developer productivity. The freedom of having the library write that SQL and give you back a useful, rich model instance (or a bunch of them) instead of just a tuple or a list of records is...
Leonardo Rochael Almeida
Python
SQLAlchemy
The Refactoring Balance Beam: When to Make Changes and When to Leave it Alone
Many developers struggle to find the balance between striving to improve existing code and letting good enough alone by accepting certain shortcomings. As a new developer to a team it can be difficult to understand existing strategies and patterns...
Amanda Sopkin
Python
Getting Started Testing in Data Science
*How do you know if your data science results are correct?* Robust software usually has tests asserting that certain conditions hold, but as a data scientist it’s often not straightforward or obvious how to integrate these best practices. Our work...
Jes Ford
Python
Testing
The Black Magic of Python Wheels
If you’ve ever `pip install`ed a Python package with C extensions on Linux, it was probably a painful experience, having to download and install development headers for libraries you’ve never even heard of. Maybe you’ve given up on pip and have sw...
Elana Hashman
Python
Building an Open Source Artificial Pancreas
Have you ever thought about what open source software or hardware could achieve? What if it could help improve people's lives by solving some of their health problems? After the medical tech industry kept promising a system to help automaticall...
Sarah Withee
Python
Maintaining a Python Project When It’s Not Your Job
PyPI is a gold mine of great packages but those packages have to be written first. More often than not, projects that millions of people depend on are written and maintained by only one person. If you’re unlucky, that person is you! So how do...
Hynek Schlawack
Python
Practical decorators
Decorators are one of Python's most powerful features. But even if you understand what they do, it's not always obvious what you can do with them. Sure, from a practical perspective, they let you remove repeated code from your callables. And se...
Reuven M. Lerner
Python
Mocking and Patching Pitfalls
Mocking and patching are powerful techniques for testing, but they can be easily abused, with negative effects on code quality, maintenance, and application architecture. These pain-points can be hard to verbalize, and consequently hard to addres...
Edwin Jung
Python
Testing
Assets in Django without losing your hair
There's one part of building a Django app I hate: setting up handling of assets and media. There are so many moving pieces — static assets, asset compilation and compression, file uploads, storage engines, etc. etc. I can never remember how it al...
Jacob Kaplan-Moss
Django
Python
Life Is Better Painted Black, or: How to Stop Worrying and Embrace Auto-Formatting
What good is a code style if it's not internally consistent? What good is a linter when it slows you down? What if you could out-source your worries about code formatting, adopt a consistent style, and make your team faster all at the same time? ...
Łukasz Langa
Python
A Guide to Software Engineering for Visually Impaired
We will look into a day in the life of a Software Engineer with limited vision to Understand their difficulties at work and how they can overcome those difficulties to become successful in their role. I am a backend Software Engineer at Yelp wh...
Abrar Ahmed Sheikh
Python
Measures and Mismeasures of algorithmic fairness
Within the last few years, researchers have come to understand that machine learning systems may display discriminatory behavior with regards to certain protected characteristics, such as gender or race. To combat these harmful behaviors, we have ...
Manojit Nandi
Python
Beyond Two Groups: Generalized Bayesian A/B[/C/D/E...] Testing
Bayesian A/B testing has gained much popularity over the years. It seems, however, that the examples stop at two groups. This begs the questions: should we not be able to do more than simple two-group, case/control comparisons? Is there a special ...
Eric Ma
Python
Testing
The Perils of Inheritance: Why We Should Prefer Composition
Inheritance is among the first concepts we learn when studying object-oriented programming. But inheritance comes with some unhappy strings attached. Inheritance, by its very nature, tends to bind a subclass to its superclass. This means that modi...
Ariel Ortiz
Python
Logging for Scientific Computing: Reproducibility, Debugging, Optimization
Itamar Turner-Trauring
Python
Django Channels in practice
Django Channels allows developers to make real-time web applications using websockets while maintaining access to the full Django batteries-included model for web applications. This talk will focus on what it takes to run a channels application in...
Aaron Gee-Clough
Django
Python
Thinking like a Panda: Everything you need to know to use pandas the right way
Using the pandas python library requires a shift in thinking that is not always intuitive to those who use it. This talk will take a deep dive into the underlying data structure of pandas to explain why it performs the way it does under certain ci...
Hannah Stepanek
Python
PEP 572: The Walrus Operator
In this talk, we'll learn about a highly controversial change to Python syntax, the rationale for it, and the fallout as the result of it. Along the way we'll go in-depth on how new ideas about Python are proposed, discussed, and become part of...
Dustin Ingram
Python
One Engineer, an API, and an MVP: Or, how I spent one hour improving hiring data at my company.
"This one quick trick will help you measure the diversity of your hiring pipeline! Read on to hear how!" One challenge in improving diversity within a hiring pipeline is the struggle to measure what exists in the first place. It's hard to know...
Nicole Zuckerman
Django
Python
A Right Stitch-up: Creating embroidery patterns with Pillow
Embroidery is a technology that dates back centuries and is still popular in the present day among craftspeople around the world. Cross-stitch refers to the creation of crosses in a grid that combines to build up an image, based on a 'chart' or pa...
Katie McLaughlin
Python
Going from 2 to 3 on Windows, macOS and Linux
At Dropbox, we’ve always used Python to power our application for Windows, macOS and Linux (until recently, Python 2.7). Over the years, a growing lack of features and the need for outdated compilers/toolchains made migrating to Python 3 a necessi...
Max Bélanger, Damien DeVille
Python
Exceptional Exceptions - How to properly raise, handle and create them
Did you know there are multiple ways to raise and capture exceptions? Have you ever wondered if you should raise a built-in exception or create your own hierarchy? Did you ever find it hard to understand what an exception meant? This talk will ...
Mario Corchero
Python
Advanced asyncio: Solving Real-world Production Problems
Everyone’s talking about it. Everyone’s using it. But most likely, they’re doing it wrong, just like we did. By building a simplified chaos monkey service, we will walk through how to create a good foundation for an asyncio-based service, inclu...
Lynn Root
Python
¡Escuincla babosa!: Creating a telenovela script in three Python deep learning frameworks
Telenovelas are beloved for their over the top drama and intricate plot twists. In this talk, we’ll review popular telenovelas to synthesize a typical telenovela arc and use it to train a deep learning model. What would a telenovela script look...
Lorena Mesa
Machine Learning
Python
Ace Your Technical Interview Using Python
Do you feel overwhelmed by the prospect of having to find a new software engineering job because you dread the technical interviewing process? Have you been putting off submitting your job applications because you think you won't be ready to inter...
Erin Allard
Python
Take Back the Web with GraphQL
GraphQL is an exciting technology that can help simplify web logic. Most of the attention has been focused on client-side improvements, such as reducing payload sizes and reducing total number of requests. This talk will show how GraphQL can struc...
Robert Myers
GraphQL
Python
Type hinting (and mypy)
Type hinting for Python (as a linter tool) came out in September 2015 as part of Python 3.5 (and was championed by Guido himself). Since then, variable annotations (plus, more recently, protocols) improved its capabilities even further. Over the l...
Bernat Gabor
Python
A Medieval DSL? Parsing Heraldic Blazons with Python!
Medieval European Nobility was obsessed with Lineage. They created a Heraldic System to track families, which assigned each family a unique Coat of Arms. Any painting of the Coat of Arms was not the official version. The official version was a ...
Lady Red, Christopher Beacham
Python
Migrating Pinterest from Python2 to Python3
Speakers: Jordan Adler, Joe Gordon Over the course of nearly a year, we migrated Pinterest's primary systems from Python2 to Python3. A large, tightly coupled codebase with over 2 million lines of code, the Pinterest codebase contained nearly ...
Jordan Adler, Joe Gordon
Python
Leveraging the Type System to Write Secure Applications
Application security remains a long-term and high-stakes problem for most projects that interact with external users. Python's type system is already widely used for readability, refactoring, and bug detection — this talk will demonstrate how type...
Shannon Zhu
Python
Lessons learned from building a community of Python users among thousands of analysts
Starting a few years ago, Capital One has committed to go all-in on public cloud and open source software for many of our core business operations, processes, and machine learning models. To support this transformation, we embarked on a multi-year...
Marina Sergeeva, Ariel M'ndange-Pfupfu, I-Kang Ding
Python
Instant serverless APIs, powered by SQLite
Serverless computing is all about paying only for what you use: it can scale up to handle millions of requests, but it can also scale down to 0, costing you nothing if your application is not receiving any traffic. Serverless tends to get expen...
Simon Willison
Python
SQLite
Serverless
Getting started with Deep Learning: Using Keras & Numpy to detect voice disorders
Deep learning is a useful tool for problems in computer vision, natural language processing, and medicine. While it might seem difficult to get started in deep learning, Python libraries, such as Keras make deep learning quite accessible. In this ...
Sebastian Hanus, Deborah Hanus
Python
Machine learning model and dataset versioning practices
Python is a prevalent programming language in machine learning (ML) community. A lot of Python engineers and data scientists feel the lack of engineering practices like versioning large datasets and ML models, and the lack of reproducibility. This...
Dmitry Petrov
Python
Set Practice: learning from Python's set types
Key takeaways: 1. Set operations enable simpler and faster solutions for many tasks; 1. Python's set classes are lessons in elegant, idiomatic API design; 1. A set class is a suitable context for implementing operator overloading. Boolean ...
Luciano Ramalho
Python
The Zen of Python Teams
The Zen of Python, accessed by running `import this`, is a list of nineteen aphorisms that have guided the development of the language. It has good advice for how to organize our code, but what does it have to say about how we organize ourselves? ...
Adrienne Lowe
Python
Eita! Why Internationalization and Localization matter
According to the always trustworthy Wikipedia, there are approximately 360 million native English speakers in the world. We, as developers, are so used to write code and documentation in English that we may not realize that this number only repres...
Nicolle Cysneiros
Python
Releasing the World's Largest Python Site Every 7 Minutes
Being able to release rapidly and continuously allows businesses to react to opportunities, shorten feedback loop for product iteration cycle and reduce debug effort for erroneous changes. At Instagram, we operate the world's largest fleet of serv...
Shuhong Wong
Python
But, Why is the (Django) Admin Slow?
The admin interface that comes built-in with Django is one of the most-loved (and oft-abused) features. However, early converts are often disappointed to find that the admin doesn't seem to be scaling as their database grows in size, forcing them...
Jacinda Shelly
Django
Python
API Evolution the Right Way
If you maintain a library, how can you innovate without breaking the projects that depend on it? Follow semantic versioning, add APIs conservatively, add parameters compatibly, use DeprecationWarnings and publish a deprecation policy, guide your u...
A. Jesse Jiryu Davis
Python
Scraping a Million Pokemon Battles: Distributed Systems By Example
I love Pokemon. However, I don't love how some players make the community less welcoming towards beginners by hiding their strategies. So I did what any defiant engineer would. I signed up for a free AWS account and began (responsibly) scraping mi...
Duy Nguyen
Python
Plan your next eclipse viewing with Jupyter and geopandas
Maps are powerful tools that we use every day. Python is well-equipped to handle spatial data and with well documented robust libraries to help you perform spatial analysis and create beautiful maps. In this talk, we'll discover the fascinating wo...
Christy Heaton
Python
Thoth - how to recommend the best possible libraries for your application
Having libraries in your Python project properly locked to a specific version is a well known best practice. Dependency management tools in the Python ecosystem lock dependencies to the latest version available, but what if the latest version avai...
Fridolín Pokorný
Python
Everything at Once: Python's Many Concurrency Models
Python makes it incredibly easy to build programs that do what you want. But what happens when you want to do what you want, but with more input? One of the easiest things to do is to make a program concurrent so that you can get more performance ...
Jess Shapiro
Python
A New Era in Python Governance
In July of 2018, Guido van Rossum stepped down as “Benevolent Dictator for Life” of Python. In December, Python core developers voted on a new governance structure to guide Python going forward. This talk explores what’s changing and how it may ...
Shauna Gordon-McKeon
Python
Working with Time Zones: Everything You Wish You Didn't Need to Know
Time zones are complicated, but they are a fact of engineering life. Time zones have [skipped entire days](http://www.bbc.com/news/world-asia-16351377) and repeated others. There are time zones that switch to [DST twice per year](https://www.timea...
Paul Ganssle
Python
Put down the deep learning: When not to use neural networks and what to do instead
The deep learning hype is real, and the Python ecosystem makes it easier than ever to neural networks to everything from speech recognition to generating memes. But when picking a model architecture to apply to your work, you should consider more ...
Rachael Tatman
Machine Learning
Python
Building reproducible Python applications for secured environments
We all have to package Python based applications for various environments, starting from command line tools, to web applications. And depending on the users, it can be installed on thousands on computers or on a selected few systems. https://pypi....
Kushal Das
Python
5 Steps to Build Python Native GUI Widgets for BeeWare
Have you ever wanted to write a GUI application in Python that you can run on both your laptop and your phone? Have you been looking to contribute to an open source project, but you don't know where to start? BeeWare is a set of software librar...
Dan Yeaw
Python
Engineering Ethics and Open Source Software
It seems that every week there is a news story that prompts software developers to think about the ethical implications of their work. As individuals, teams, and communities we need to consider the impact of the code we write. But what about code ...
Hayley Denbraver
Python