PyCharm, Inspector, namedtuple -> unexpected argument

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Ich beschäftige mich gerade mit PyCharm (Community-Edition, 2017.1.3) und versuche den code-inspector der IDE gerade zufriedenzustellen.

Code: Alles auswählen

class Position(VectorMixin, namedtuple('PositionT', 'x y')):
    """A specialized two-dimensional vector to represent positions. """
    def __new__(cls, x: Num, y: Num) -> 'Position':
        return tuple.__new__(cls, (x, y))

Position.NULL = Position(0, 0)
Die Zeile return tuple.__new__(cls, (x, y)), hier (x, y) wird mit der Meldung "Unexpected argument" moniert. Der Code läuft einwandfrei.

Gibt es hier etwas, dass ich nicht berücksichtigt habe?
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Meine Metaprogramming-Tage liegen etwas zurueck - was mich nur wundert: warum rufst du die tuple-__new__ auf? Bekommst du damit nicht ein tuple zurueck? Bzw. wozu ueberhaupt?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@bwbg: das aktuelle __new__ kann ersatzlos gestrichen werden. Da tuple in C programmiert ist, funktioniert wahrscheinlich die Argument-Ermittlung nicht. Dass das als Warnung ausgegeben wird, ist in diesem Fall also übertrieben.

@__deets__: namedtuple ist eine Subklasse von tuple, also kann man __new__ direkt von tuple aufrufen, wenn man will. Die Klasse, die __new__ tatsächlich erzeugt, wird über das cls-Argument festgelegt.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Ich wollte eingangs nur ein Minimalbeispiel liefern, bei welchem der Hinweis von PyCharm auftritt. Nachfolgend ist ein Beispiel, bei welchem der Konstruktor überschrieben wurde, jedoch zuvor Berechnungen ausführt:

Code: Alles auswählen

class BoundingBox(namedtuple('BoundingBoxT', 'x y width height')):
    """A par-axial rectangle to represent a bounding box (gosh!). """
    def __new__(cls, x: Num, y: Num, width: Num, height: Num) -> 'BoundingBox':
        return tuple.__new__(cls, (x if width > 0 else x + width,
                                   y if height > 0 else y + height,
                                   abs(width),
                                   abs(height)))
Die Klasse BoundingBox stellt weitere Methoden bereit, daher leite ich direkt von dem nametuple ab.

@Sirius3: Siehe neues Beispiel. Redefinieren von __new__ ist in dem eingangs genannten Beispiel nicht notwendig. Das ist mir auch bewusst.

Nun, dann muss ich wohl mit den Warnungen leben oder diese für die entsprechenden Codebereiche gezielt abschalten :roll:

Nachtrag: Ich habe soben auf die PyCharm Community Edition 2017.2.3 aufgerüstet. Einige Hinweise sind entfallen, andere hinzugekommen (false positives). Der oben genannte bleibt.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Antworten