-
Notifications
You must be signed in to change notification settings - Fork 4
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
Introducing classes to track issues #26
Conversation
Looks good to me, @loradd is the maintainer of Pylasu so I'd let him review and merge |
Thank you @alessiostalla ! |
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.
Looks good to me! I left a minor comment 👍
pylasu/validation/validation.py
Outdated
class Result: | ||
root: Node | ||
issues: List[Issue] = field(default_factory=list) |
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.
Should this extend WithIssues?
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.
You are right, I am just not sure of how the field definition works with inheritance, but I made the change
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.
I think we should define the issues
list as simply being initialised with []
, rather than using the default factory. This, to avoid having to repeat the property definition for each sub-dataclass.
|
||
|
||
@dataclass | ||
class FirstStageResult(WithIssues): |
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.
FirstStageResult
should have an issues: List[Issue] = default_factory(list)
property to avoid a dataclass
missing field error.
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.
Note that the issues
list here would not be required if following the comment concerning WithIssues
below
|
||
|
||
@dataclass | ||
class LexingResult(WithIssues): |
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.
Same as FirstStageResult
and every other WithIssues
subclass
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.
Note that the issues
list here would not be required if following the comment concerning WithIssues
below
pylasu/validation/validation.py
Outdated
@@ -35,7 +35,11 @@ def semantic(message: str, severity: IssueSeverity = IssueSeverity.ERROR, positi | |||
return Issue(IssueType.SEMANTIC, message, severity, position) | |||
|
|||
|
|||
class WithIssues: | |||
"""Many classes have the necessity of tracking issues""" | |||
issues: List[Issue] = field(default_factory=list) |
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.
To avoid having to repeat the property for each subclass, we could change this to ... = []
rather than using the default_factory
which is used for dataclasses. Defining this same class as dataclass would instead induce errors with the constructors.
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.
issues = []
doesn't do what one would expect in Java or Kotlin – it's like a static field so all classes instances would potentially share the same (mutable) list.
I agree that field
is only used with @dataclass
so either WithIssues
has to be decorated with @dataclass
or it should be defined as follows:
class WithIssues:
"""Many classes have the necessity of tracking issues"""
issues: List[Issue]
def __init__(self):
self.issues = []
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.
I agree, then each subclass should be responsible of explicitly invoking the WithIssues
constructor. If defining WithIssues
as @dataclass
, each field in the subclasses should be defined as optional and explicit names in creating new objects should be used to avoid confusion (issues
would be the first constructor parameter).
EDIT: I think we should go for the solution proposed by @alessiostalla - i.e. adding init = False
to the issues field in WithIssues
I should learn some Python :) |
IMHO this kinda defeats the point of WithIssues, because it forces you to redeclare the field in subclasses.
This won't include the field in the generated constructor, and it will make it possible for subclasses to have mandatory fields. If for a certain subclass one wants to include the issues list in its constructor for whatever reason, they can redeclare the field only for that specific subclass. |
Thank you @alessiostalla for the suggestion! |
Thank you! |
When working on a project using Pylasu I noticed the need for a few supporting classes, that I introduced in that project but which I think it would be useful to have in Pylasu.
I am adding that here, but I a Pylasu newbie, so a review would be welcome.
I am asking a review to @alessiostalla as I got "inspiration" from what he was doing in a project