[英]Python function returns True or 1 as None, while returning False and 0 correctly
[英]Python function returns value while debug, but None while run
我有一個 function 從調試器運行時可以正常工作,但否則返回None
。
class HotelRoom(object):
def __init__(self, guestlst=[]):
self.guestlst = guestlst
def __repr__(self):
if self.guestlst == []:
self.guestlst.append("empty")
return 'HotelRoom(guestlst=%r)' % self.guestlst
def maybeFill(self, newGuests):
# return new guestlist on success; return None on failure
if self.guestlst == ["empty"]:
self.guestlst = newGuests
return self.guestlst
return None
if __name__ == "__main__":
h = HotelRoom()
print(h.maybeFill(["Nathan"]))
如果我使用調試器逐步完成,這工作正常,並且它具有["Nathan"]
的預期 output 。
如果我只是運行它, output 是None
。
為什么函數的 output 取決於它是否在調試器中運行?
發生這種情況是因為您的__repr__
function 更改了它應該打印的值。 當您在調試器中時,調試器嘗試向您顯示值的表示的行為會通過將[]
更改為['empty']
來更改該值。
因為maybeFill
function 將列表與['empty']
進行比較,所以當實際值為[]
時,它返回 false ,如果從未調用repr()
,它將始終如此。
不那么令人驚訝的__repr__
只會顯示該值,但永遠不會更改它。 然后考慮將空值保留為[]
而不是將其轉換為['empty']
:
class HotelRoom(object):
def __init__(self, guestlst=[]):
self.guestlst = guestlst
def __str__(self):
if self.guestlst:
return 'Hotel room, with guests: %s' % ', '.join(self.guestlst)
return 'Empty hotel room'
def __repr__(self):
return 'HotelRoom(guestlst=%r)' % self.guestlst
def maybeFill(self, newGuests):
# return new guestlist on success; return None on failure
if self.guestlst == []:
self.guestlst = newGuests
return self.guestlst
return None
if __name__ == "__main__":
h = HotelRoom()
if h.maybeFill(["Nathan", "John"]) == None:
print("If you see this, the problem is not solved")
print(h)
正如您在https://ideone.com/drlN6w的在線解釋器中看到的那樣,即使沒有調試器導致__repr__
或__str__
被提前調用,上述方法也有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.