-
Notifications
You must be signed in to change notification settings - Fork 2
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
API-Anpassungen: Wrapper-Objekte #111
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bezüglich nur geparste/validierte States an Question/Attempt bin ich mir unsicher. Wir müssen an den Fall denken, dass eine Frage in eine andere Frage eingebettet wird. Dazu muss sämtliche Logik zum Validieren und Dumpen in den Klassen selber liegen (bzw. idealerweise die Pydantic-Werkzeugkiste genutzt werden).
Meine Vorstellung war, dass das JSON-Dumpen/Parsen (von/nach JsonValue
) im Wrapper geschieht. Zwischen der Frage und dessen Subquestions kann dann der Austausch der States in Form von JsonValues geschehen. Ich denke hier an den Fall, dass die Frage auf einfache Weise die States der Subquestions in den eigenen State aufnehmen können muss.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Du weichst von der ursprünglichen Planung in Tefen ab, in der die Methoden Question.start_attempt -> AttemptStartedModel, get_attempt -> AttemptModel und score_attempt -> AttemptScoredModel vorgesehen waren. Warum?
Ich bin mir selber nicht mehr sicher, warum ich das so hatte. Ein Vorteil wäre, dass wir dann den Paketen das Aussehen der Attempt-Klasse nicht vorschreiben würden.
Ich glaube meine Verunsicherung kommt auch daher, dass ein externer Akteur zuerst formulation
und danach erst score_response
aufrufen könnte.
Bezüglich deiner Frage zu Attempt.from_plain_states
: Ich denke wie es jetzt ist, ist es schon in Ordnung, solange wir nicht doch noch Question.score_attempt
einführen sollten.
Examples: | ||
This example shows how to subclass [`QuestionType`][questionpy.QuestionType]: | ||
def start_attempt(self, variant: int) -> Attempt: | ||
attempt_state = self.attempt_class.make_attempt_state(self, variant) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ich finde es zwar logisch, die Logik zum Erstellen eines neuen attempt_state in der Attempt-Klasse (als classmethod) unterzubringen, aber in Verbindung mit typing hat das den Nachteil, dass man in einer eigenen make_attempt_state
Implementierung seine eigene Question-Klasse nicht angeben kann, ohne dass mypy meckern wird.
Die Wahrscheinlichkeit ist ja sehr hoch, dass man mind. auf die Options zugreifen will, um den attempt_state zu erzeugen.
(Das ist kein Blocker, der das Mergen verhindert. Darum können wir uns auch an anderer Stelle kümmern.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Das Problem trifft tatsächlich auch auf Question.make_question_state
zu. make_attempt_state
war ein Versuch, damit Symmetrie herzustellen. Eine Lösung habe ich allerdings nicht parat. Wenn mypy PEP 695 unterstützt, könnten wir nochmal die Verwendung von Generics eroieren.
Ich glaube mein Ziel war es, dass die Models weitgehend nur auf QuestionInterface-Ebene und darüber genutzt werden, und die Question-Ebene konsistent nur mit Properties arbeitet. Das klarifiziert denke ich die Trennung der beiden Ebenen.
Aktuell schreiben wir ja schon große Teile der Attempt-Klasse in |
Ja, so richtig schön ist das nicht, wenn wir hier Models verwenden würden. Ich finde die Methoden Mir ist das Design an der Stelle recht wichtig, weil man die Attempts ggf. auch als Unterfrage in einer eigenen Frage verwenden will. |
50ad7a8
to
2951478
Compare
Habe ich in 89deaa0 mal testweise umgesetzt. Wenn Attempt die Protocols explizit als Superklassen deklariert, schlägt Mypy an, weil es |
Trivial init functions needn't be written manually by devs.
89deaa0
to
a4beb5c
Compare
a4beb5c
to
0c1db54
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Danke dir
0c1db54
to
e0fdfe5
Compare
Bisher noch out of scope:
Question.prefix
create_placeholder
create_input
u.ä.call_js
&add_css
Etwas anders als in questionpy:api befassen sich die High-Level Klassen (
Question
undAttempt
) nur mit geparsten States. Wollen Paketentwickler:innen die String-Repräsentation ihrer States beeinflussen, können relativ einfach die Wrapper gesubclassed oder in die Pydantic-Werkzeugkiste gegriffen werden (z.B. mit eigenen Validators bzw. Serializern auf der State-Klasse).