Seite 1 von 1
PyCharm, Inspector, namedtuple -> unexpected argument
Verfasst: Donnerstag 5. Oktober 2017, 07:03
von bwbg
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?
Re: PyCharm, Inspector, namedtuple -> unexpected argument
Verfasst: Donnerstag 5. Oktober 2017, 09:47
von __deets__
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?
Re: PyCharm, Inspector, namedtuple -> unexpected argument
Verfasst: Donnerstag 5. Oktober 2017, 10:09
von Sirius3
@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.
Re: PyCharm, Inspector, namedtuple -> unexpected argument
Verfasst: Donnerstag 5. Oktober 2017, 10:16
von bwbg
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
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.