\[ [Index](index.md) | [Exercise 9.1](ex9_1.md) | [Exercise 9.3](ex9_3.md) \]

# Exercise 9.2

*Objectives:*

- Learn how to create a Python package

**Note**

This exercise mostly just involves copying files on the file system.
There shouldn't be a lot of coding.

## (a) Making a Package

In previous exercises, you created the following files that were related to
type-checked structures, reading data, and making tables:

- `structure.py`
- `validate.py`
- `reader.py`
- `tableformat.py`

Your task is to take all of these files and move them into a package called `structly`.
To do that, follow these steps:

- Make a directory called `structly`
- Make an empty file `__init__.py` and put it in the `structly` directory
- Move the files `structure.py`, `validate.py`, `reader.py`, and `tableformat.py` into the `structly` directory.
- Fix any import statements between modules (specifically, the `structure` module depends on `validate`).

Once you've done that, modify the `stock.py` program so that it looks exactly like this
and that it works:

```python
# stock.py

from structly.structure import Structure

class Stock(Structure):
    name = String()
    shares = PositiveInteger()
    price = PositiveFloat()
    
    @property
    def cost(self):
        return self.shares * self.price

    def sell(self, nshares: PositiveInteger):
        self.shares -= nshares

if __name__ == '__main__':
    from structly.reader import read_csv_as_instances
    from structly.tableformat import create_formatter, print_table
    portfolio = read_csv_as_instances('Data/portfolio.csv', Stock)
    formatter = create_formatter('text')
    print_table(portfolio, ['name','shares','price'], formatter)
```

\[ [Solution](soln9_2.md) | [Index](index.md) | [Exercise 9.1](ex9_1.md) | [Exercise 9.3](ex9_3.md) \]

----
`>>>` Advanced Python Mastery  
`...` A course by [dabeaz](https://www.dabeaz.com)  
`...` Copyright 2007-2023  

![](https://i.creativecommons.org/l/by-sa/4.0/88x31.png). This work is licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/)
