2017-01-25 3 views
-5

Ich versuche, einen einfachen Code zu schreiben, der prüft, ob ein bestimmtes Verzeichnis existiert und ob dieses Verzeichnis irgendwelche Dateien enthält. Wenn es existiert und es Dateien enthält, dann möchte ich, dass es etwas tut. Wenn nicht, dann möchte ich, dass es etwas anderes macht.Wenn etwas wahr ist

Ich habe das OS-Modul verwendet, um die Datei-Explorer-Operationen durchzuführen und bis jetzt scheint es gut zu funktionieren.

if os.listdir("D:\Inventory\Joy\XL") != []: #Checks to see if the directory is empty 
    print("This directory is full") 
else: 
    print("This directory is empty") 


if (os.path.exists("D:\Inventory\Joy\XL")) is True: #THIS ISN'T RIGHT BUT I DON'T KNOW WHAT TO DO. 
    print("This directory exists") 
else: 
    print("The directory doesn't exist") 

Ich habe gelesen, dass man vermeiden sollte „wenn x == True Then y“ oder „wenn x Wahr dann y“, aber ich weiß nicht, wie (oder warum) es zu vermeiden. Außerdem würde ich nicht wissen, wie ich es umsetzen soll, auch wenn ich die Konvention missachten wollte. Die Leute sagen, es ist überflüssig, aber ich verstehe auch nicht warum. Ich habe ähnliche Einträge in Stack Overflow zu diesem Problem gelesen, aber ich habe keine der Antworten verstanden.

+3

Yeesh, warum sind Sie "print'-in der Bedingung? Hast du auch damit experimentiert, "is True" von überall zu entfernen und zu sehen, was passiert ist? – miradulo

+1

'is' würde einen Booleschen Wert mit einem booleschen Wert vergleichen, aber Sie beginnen mit etwas, das einem booleschen Wert entspricht, so dass nichts gewonnen wird und Sie eine zusätzliche Assemblyoperation erhalten. – Sayse

+4

' print' gibt (außer Druckmaterial) 'None zurück ', was nicht dasselbe wie' True' ist. Fügen Sie Ihre Debugging-Ausgabe nicht in die Bedingung ein. –

Antwort

0

ich gelesen habe, dass man vermeiden sollte „wenn x == True Then y“ oder „wenn x Wahr dann y“, aber ich weiß nicht, wie (oder warum) es zu vermeiden.

Die bevorzugte Art sieht wie folgt aus:

foo = False 
bar = True 
if foo: 
    print "Foo!" 
elif bar: 
    print "Bar!" 
else: 
    print "Someone broke logic!" 

Dieser Stil bevorzugt, weil sie die redundante vermeidet „True“.

Die Leute sagen, es ist überflüssig, aber auch hier, ich verstehe nicht, warum

Es weil für jeden Ausdruck e redundant ist, in einem Booleschen Kontext ausgewertet, e is True == e. "In einem booleschen Kontext ausgewertet" bedeutet lediglich, dass wir testen, ob der Wert des Ausdrucks einer der "Falsey" -Werte [False, None, [], {}, "", 0] ist. Wenn es einer dieser Werte ist, ist das Ergebnis False. Wenn nicht, ist es True.

+0

Das Hauptproblem ist, er druckt in dem Zustand. – Max

+0

@Max Es gibt viele Probleme hier. –

+0

Ich habe es gedruckt, um genau zu sehen, wie sich Python verhält, weil ich es offensichtlich noch lerne. Jon Kiparsky, für die Redundanz war mir nicht bewusst, dass angenommen wurde, dass die Bedingungen wahr waren, wenn sie bewertet wurden. Das ist absolut nicht intuitiv für mich. Trotzdem verstehe ich, dass das jetzt der Fall ist. Vielen Dank. Ich verstehe vollständig, dass es Probleme mit dem Code gibt, aber ich habe es aufgenommen, damit eine erfahrene Person es korrigieren konnte. Ich habe es so geschrieben, wie es für mich Sinn macht. Ich versuche immer noch, den besten Weg herauszufinden. – Ghoti

1

Der idiomatische Weg zu testen, dass eine Liste ist

if os.listdir("D:\Inventory\Joy\XL"): 

nicht leer ist, die leeren Listen als falsche Werte und nicht leere Listen als wahre Werte behandelt.

Da os.path.exists gibt einen boolean, gibt es keine Notwendigkeit etwas zu tun, die einfach eine andere boolean zurück; Du hast schon eins. Der Vergleich eines True Wertes mit True ergibt True; Vergleichen False zu True gibt False zurück, so erhalten Sie nur Ihre ursprüngliche Eingabe zurück.

if os.path.exists("D:\Inventory\Joy\XL"): 
+0

Ja; Ich habe das Original nicht genau genug gelesen. – chepner

Verwandte Themen