簡體   English   中英

Python function 在調試時返回值,但在運行時返回無

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM