Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generics #1

Merged
merged 79 commits into from
Sep 17, 2023
Merged

Generics #1

merged 79 commits into from
Sep 17, 2023

Conversation

delfick
Copy link
Owner

@delfick delfick commented Sep 17, 2023

This PR is the result of nearly 10 months of me tackling this a bit at a time every few weeks.

All I wanted to do was this:

    it "can make generic types":
        container = reg.create(Container[ItemOne], {"category": "one"})
        assert isinstance(container.item, ItemOne)
        assert container.item.one == 20
        assert container.item.two == 50
        assert not container.item.three

        container2 = reg.create(Container[ItemTwo], {"category": "two"})
        assert isinstance(container2.item, ItemTwo)
        assert container2.item.one == 3
        assert container2.item.two == 5
        assert container2.item.four

Turns out python type annotations aren't very nice to introspect and you have to do some fiddly things to understand when a type is optional or annotated or generic and how inheritance changes things.

I also wanted to make it so registering creators could be more powerful, which resulted in the need to be able to sort type annotations by complexity so that I could deterministically and efficiently find the most appropriate creator for a given type. With this sorting capability I'm able to look at the most specific creators before the most generic creators.

I also took a rabbit hole into resolving python typing ForwardRefs. This is where a type annotation is represented as a string at runtime because it was for a type not available at the time it was referenced. If these aren't resolved then strcs can't find the correct creator for that field. I will rejoice when I can make strcs support 3.13 and remove this resolving logic because of https://peps.python.org/pep-0649/

I've also slipped in package upgrades to use hatchling.

Better typing and don't store additional attributes on the class
@delfick delfick merged commit 06aa115 into main Sep 17, 2023
18 checks passed
@delfick delfick deleted the generics branch September 17, 2023 06:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant