2015-04-19 15 views
7

Wie kann ich den Python-Funktionsparameter so begrenzen, dass er nur Arrays bestimmter Größe akzeptiert?Wie Funktionsparameter als Array mit fester Größe zu begrenzen?

habe ich versucht, diese aber es lässt sich nicht kompilieren:

def func(a : array[2]): 

mit

TypeError: 'module' object is not subscriptable 

Ich bin neu in dieser Sprache.

+9

[Typ Hinweise] (https://www.python.org/dev/peps/pep-0484/) wird voraussichtlich mit Python 3.5 ausgeliefert, die noch nicht fertig ist. – myaut

+0

Meine Empfehlung wäre enger mit dem verbunden, was Sie konkret erreichen möchten. Warum nur 'liste'? Wären andere Sequenzen nicht akzeptabel? Und warum genau zwei Elemente? Was repräsentieren sie? Warum möchten Sie sie in einer "Liste" anstatt als zwei separate Argumente übergeben? –

+0

@myaut Werden diese Typhinweise zur Kompilierzeit oder zur Laufzeit überprüft? Wird es auch direkt von Python unterstützt oder wird eine externe Software benötigt? Denn wie ich es sehe - es ist irgendwie zu abstrakt und optional. – AnArrayOfFunctions

Antwort

10

Wie wäre es mit der Überprüfung der Länge innerhalb der Funktion? Hier habe ich nur einen Fehler gemeldet, aber Sie könnten alles tun.

def func(array): 
    if len(array) != 2: 
     raise ValueError("array with length 2 was expected") 
    # code here runs if len(array) == 2 
+1

'raise ValueError' wäre besser. – myaut

+0

vereinbart. Vielen Dank. – Totem

6

erste Weg (Sie werden die meisten wahrscheinlich wollen diese benutzen)

Sie können nur durch den Einsatz if Anweisungen in Ihrer Funktion für alle Kriterien überprüfen:

def func(a): 
    if not isinstance(a, collections.abc.Sequence): 
     raise TypeError("The variable has a wrong type") 
    elif len(a) != 2: 
     raise ValueError("Wrong length given for list") 
    # rest of the code goes here 

2. Weg (nur zum Debuggen)

Sie könnenverwendenals Umgehungslösung (für das Debuggen gemeint):

def func(a): 
    assert isinstance(a, collections.abc.Sequence) and len(a) == 2, "Wrong input given." 
    # rest of the code goes here 

diese So prüft, ob beide Kriterien erfüllt werden, sonst wird ein assertion error wird mit der Meldung Falscher Eingang Typ angehoben werden.

+0

Nein, verwende 'assert' nicht für Dinge, die in der Produktion vorkommen können (d. H. Außerhalb von Testfällen): Es wird nur eine Ausnahme ausgelöst, wenn' __debug__' falsch ist. [Siehe Dokumentation.] (Https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) –

+0

Ok, ich habe die Antwort aktualisiert. – nikaltipar

+0

Sie sollten nicht nach der Liste suchen; Suchen Sie nach 'collections.abc.Sequence'. Typprüfung, wenn Sie es jemals tun, sollte auch 'isinstance' anstelle von' type' verwenden. Sie möchten also etwas wie "wenn nicht isinstance (a, collections.abc.Sequence):" – sapi

Verwandte Themen