2017-04-22 1 views
1

Ich schreibe eine einfache Python-Klasse namens "Tasche":Wie erstelle ich ein "optionales" Argument in Python?

class Bag: 
def __init__(self, items=None): 
    if self.items == None: 
     self.items = defaultdict() 
    else: 
     temp_dict = defaultdict() 
     for key in self.items: 
      temp_dict[key] += 1 
     self.items = temp_dict 

Die variablen Artikel in einer Liste von Objekten nimmt, wie zum Beispiel:

['d','a','b','d','c','b','d'] 

Von dort „def __init __ (selbst, item = None „) wird entweder:

  1. initialisieren Artikel als leere defaultdict, wenn nichts übergeben wurde in Artikel oder
  2. Initialisieren der in Argument übergeben, wenn eine Liste von Objekten in Artikel geben wurden.

Zum Beispiel sollte diese Arbeit:

b = Bag() 

Das Fehlen eines Argument sollte in Ordnung sein, wie Artikel gesetzt ist, standardmäßig auf _None.

Allerdings wirft dies immer eine Ausnahme (von einem Skript, das auf Fehler überprüft):

*Error: b = Bag() raised exception AttributeError: 'Bag' object has no attribute 'items' 

Ich will Bag() ohne ein vorübergehendes ein Argument in Elemente zu setzen initialisieren.

Hoffe alles ist klar, sag mir, wenn es nicht ist.

Irgendwelche Ideen oder irgendetwas falsch mit dem Code?

+3

Ich denke, du kannst 'def __init __ (self, items = None) : 'das erlaubt immer noch' Items', die optional gesetzt werden können, wenn Sie es setzen möchten – davedwards

+0

@downshift Ich habe die von Ihnen vorgeschlagenen Änderungen vorgenommen, aber es gibt mir immer noch die selbe Ausnahme. –

+0

meine Entschuldigung, legte "self.items = items" als die erste Zeile nach 'def __init __ (..' – davedwards

Antwort

2
from collections import defaultdict 

class Bag(object): 

def __init__(self, items=None): 
    self.items = items or list() 
    if not self.items: 
     self.items = defaultdict() 
    else: 
     temp_dict = defaultdict() 
     for key in self.items: 
      temp_dict[key] += 1 
     self.items = temp_dict 

Ich habe ein paar Korrekturen:

1) erstellen self.items und initialisieren mit None mit items 2) vergleichen is None, oder einfach not self.items, da leere Listen zu False

+3

Vorsicht vor dem veränderlichen Standard http://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument –

+1

Bitte nie Verwenden Sie einen veränderbaren Wert als Voreinstellung für ein Argument.Es wird zum Zeitpunkt der Funktionsgenerierung erstellt und _auf alle Aufrufe verteilt, _ Wenn also Ihre Funktion 'Elemente' aktualisiert, wird der nächste Anruf sie sehen.Verwenden Sie' None' als Standard benutze 'items oder []' (oder 'iems oder defaultdict (int)' in deinem fall) wenn du darauf zugreifst – 9000

+0

danke ... ich habe meinen code aktualisiert – labheshr

1

'Bag' object has no attribute 'items' Mittel bewerten : irgendwo in der Bag Methode greifen Sie auf self.items, die nicht definiert wurde.

Und tatsächlich tun Sie. Im Konstruktor schreiben Sie: if self.items == None:vor Sie machen die erste Zuordnung zu self.items, so dass es erstellt.

Ich denke, es ist ein Tippfehler, und Sie meinten if items is None:, bezogen auf den Parameter.

Dieser Code kann jedoch vereinfacht werden.Meine Meinung:

import collections # Batteries included. 

... 
def __init__(self, items=None): 
    if not items: # Covers both None and empty list. 
     self.items = {} 
    else: 
     self.items = collections.Counter(items) 

Diese noch vereinfacht werden kann:

 ... 
    self.items = collections.Counter(items or []) 

Wenn Sie eine reine wollen ein defaultdict verwenden, können Sie:

 self.items = collections.defauldict(int, collections.Counter(items or [])) 

(Beachten Sie, dass defaultdict() ohne ein Argument macht eher wenig Sinn.)

+0

Danke für den Vorschlag. Ich würde gerne Counter verwenden, aber leider benötigt das Projekt, an dem ich arbeite, die Verwendung von "defaultdict". –

+0

Wenn Sie den zusätzlichen Vorschlag herausnehmen, löst dies Ihre Frage, ohne Ihren ursprünglichen Code zu "ändern". –

+0

Meine Antwort wurde aktualisiert. – 9000

Verwandte Themen