Improved type hinting for models
robinvandernoord opened this issue · comments
Since according to the documentation field types are hinted to specific Python objects, it would be great to be able to type hint the result of queries as a specific model with the right types for each property.
user_1: User = db(db.User.id == 1).select().first()
# user_2 could automatically be hinted to User
user_2 = db.User(id=2)
group_1.name # currently a Field unless I define `name: str = Field()`
Of course, assigning to Field()
can't figure out the right type, but maybe doing name = Field.string()
can provide this behavior?
Possibly, this could interfere with Query creation but it would be a really nice feature to have IntelliSense for database rows.
It's just a suggestion, for now I will just use my own subclass of Field:
class TypedField(Field):
@classmethod
def string(cls, *args, **kwargs) -> str:
return super().string(*args, **kwargs)
@classmethod
def int(cls, *args, **kwargs) -> int:
return super().int(*args, **kwargs)
# etc...
This is actually tracked in emmett-framework/firestorm#5
Some ORM issues were moved there because of #309
Specifically regarding your suggestions, actually:
User.get(1)
does not return a User
object. It returns a dynamic class UserRow
generated by the User
model which is actually a subclass of StructuredRow
.
So while binding types to fields would be easy, managing type hints on several ORM functions will be more complicated.
Btw I just saw you made https://github.com/trialandsuccess/TypeDAL, so even if I didn't check the code, I think it could be a starting point also for the Emmett ORM.