emmett-framework / emmett

The web framework for inventors
Other
1.03k stars 70 forks source link

Improved type hinting for models #462

Open robinvandernoord opened 1 year ago

robinvandernoord commented 1 year ago

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...
gi0baro commented 1 year ago

This is actually tracked in https://github.com/emmett-framework/firestorm/issues/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.