dfurtado / dataclass-csv

Map CSV to Data Classes
Other
194 stars 21 forks source link

Does not support __future__.annotations #22

Closed johnthagen closed 3 years ago

johnthagen commented 4 years ago

This code:

#!/usr/bin/env python3

from dataclasses import dataclass

from dataclass_csv import DataclassReader

@dataclass
class User:
    firstname: str
    email: str
    age: int

def main() -> None:
    with open('test.csv') as users_csv:
        reader = DataclassReader(users_csv, User)
        for row in reader:
            print(row)

if __name__ == '__main__':
    main()

Runs correctly:

User(firstname='Elsa', email='elsa@test.com', age=11)
User(firstname='Astor', email='astor@test.com', age=7)
User(firstname='Edit', email='edit@test.com', age=3)
User(firstname='Ella', email='ella@test.com', age=2)

With the following test.csv:

firstname,email,age
Elsa,elsa@test.com, 11
Astor,astor@test.com, 7
Edit,edit@test.com, 3
Ella,ella@test.com, 2

But using __future__.annotations, which will be mandatory in Python 4.0 and is useful in Python 3.7+, breaks DataclassReader:

#!/usr/bin/env python3

from __future__ import annotations

from dataclasses import dataclass

from dataclass_csv import DataclassReader

@dataclass
class User:
    firstname: str
    email: str
    age: int

def main() -> None:
    with open('test.csv') as users_csv:
        reader = DataclassReader(users_csv, User)
        for row in reader:
            print(row)

if __name__ == '__main__':
    main()
Traceback (most recent call last):
  File "test.py", line 25, in <module>
    main()
  File "test.py", line 20, in main
    for row in reader:
  File "venv/lib/python3.7/site-packages/dataclass_csv/dataclass_reader.py", line 211, in __next__
    return self._process_row(row)
  File "venv/lib/python3.7/site-packages/dataclass_csv/dataclass_reader.py", line 159, in _process_row
    or '__origin__' in field_type.__dict__