2016-07-05 17 views
0

Ich arbeite an einem Inventarsystem für ein Spiel, an dem ich arbeite, ich habe diese Code-Blöcke bisher für das System geschrieben. Ich möchte das System ohne die Verwendung von globalen Funktionen arbeiten, weil ich gelesen habe, dass Sie globale Funktionen vermeiden sollten.Wie referenziere ich lokale Variablen in meinem Code, ohne die globalen Funktionen zu verwenden?

while not done: 
    global inventory 
    pygame.mouse.set_visible(False) 
    #Event processing 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 
    elif event.type == pygame.KEYDOWN: 
     if event.key == pygame.K_i: 
      inv_sys.inventory = True 
      inv_sys.inventory_u() 

import pygame 
import Constants 

clock = pygame.time.Clock() 
screen = pygame.display.set_mode(Constants.screen_size) 
inv = pygame.image.load("inv.png").convert() 
test = False 

def uninventory(): 
    global inventory 
    inventory = False 

def inventory_u(): 

    while inventory: 
     pygame.mouse.set_visible(True) 
     screen.blit(inv,(0,0)) 
     for event in pygame.event.get(): 

      if event.type == pygame.QUIT: 
       pygame.quit 
      elif event.type == pygame.KEYDOWN:  
       if event.key == pygame.K_i: 
        uninventory() 

     pygame.display.update() 
     clock.tick(60) 

Vielen Dank im Voraus für jede Hilfe!

Antwort

0

Überlegen Sie, warum möchten Sie eine lokale Variable zwischen vielen Funktionen teilen? Vielleicht besser für Sie ist einfach eine Klasse zu erstellen, wobei inventory oder etwas beschreibender wird als Objektvariable sein.

class MyGame: 
    def __init__(): 
     # something 
     self.inventory = True 
    # some code 
    def unEquip(): 
     self.inventory = False 
2

weil ich gelesen habe, dass Sie sollten mit [globale Aussagen] vermeiden

Ich glaube, Sie falsch verstanden haben. Das Schlüsselwort global ist nicht schlecht an und für sich. Wenn Ihre Implementierung die Verwendung von das Schlüsselwort global erfordert, ist Ihre Implementierung eher schlecht (in den meisten Fällen, obwohl es Ausnahmen geben kann). Anstatt Code mit globalen Variablen zu schreiben, sollten Sie versuchen, Ihre Variablen an die Funktionen zu übergeben.

def main(): 
    eels = 42 
    start_hovercraft(eels) 

def start_hovercraft(number_of_eels): 
    if number_of_eels > 3: 
     raise Exception("My hovercraft is full of eels!") 

@ PatNowak Vorschlag, eine Klasse zu verwenden, ist auch ein guter Weg, um das Problem, aber der Kern des Problems ist, dass Sie global vermeiden sollten, wann immer möglich, weil es zu fehlerhaftem Code führt:

1

Wenn Sie häufig auf eine Variable verweisen, deren Wert einmal zugewiesen und nicht geändert wurde, definieren Sie sie im Modulbereich nahe dem Anfang der Datei gemäß PEP 8 style guide, damit sie für jeden, der Ihren Code liest, eindeutig eine Konstante ist. Ihre Importanweisungen sollten auch am Anfang der Datei stehen.

Wenn es etwas ist, auf das Sie innerhalb des Programms verweisen und verwenden, um den Status des Programms zu ändern, wie Sie mit global inventory machen, sollte es (und die Methoden, die darauf verweisen) wahrscheinlich Teil einer Klassendefinition sein, die die Variable als Eigenschaft, wie PatNowak beschreibt. Sie können innerhalb oder außerhalb der Klasse auf diese Methoden verweisen (mit self oder einer Klasseninstanz), aber die Eigenschaft selbst sollte nur direkt in der Klasse geändert werden, da sonst Ihr Code schnell nicht mehr debuggen oder neu schreiben kann.

Das globale Schlüsselwort hat seine Verwendung, aber ich hatte nie einen Grund, es anstelle einer dieser beiden anderen Methoden zu verwenden.