2011-02-04 23 views
1

我經常寫下面的代碼:蟒蛇3:日誌功能簽名問題

print('object', 'moved', 'from =', object.location, 'dest =', new_location) 
print('object', 'created', 'at =', object.location, 'status =', status) 

等。

我正打算用功能log,以取代所有這些:

def log(self, action, **details): 
    print('object', action, end = '') 
    for var, value in state.items(): 
     print(var, '=', value, end = '') 
    print() 

幾乎作品 - 除了兩個問題。首先,我無法控制輸出的順序,這對我很重要。當然,details只是一個字典,所以參數的順序會丟失。其次,我不能使用任何語言關鍵字,例如from作爲關鍵字參數的名稱。

有沒有解決方案可以避免不必要的冗長,但不會遇到這些問題?

我想使用log函數的原因是我可能想要禁用/啓用它或在​​單個位置更改格式。

回答

4

你知道logging模塊,我知道嗎?

我只想用預製的消息,並替代了必要的位:如果您確實需要做到這一點的

movedmsg = "object moved from = {0} to = {1}" 
print(movedmsg.format(object.location, new_location)) 

movedmsg = "object moved from = %s to = %s" 
print(movedmsg % (object.location, new_location)) 

你可能更喜歡字符串格式化的新風格一個類似字典的結構,你可以創建一個OrderedDict。但是這有點冗長。這不是真正的「一個明顯的做法」。

+0

我絕對推薦檢查日誌模塊。 Vinay寫了一個很好的方法,希望能夠使它更加容易理解:http://docs.python.org/3.2/howto/logging.html – ncoghlan 2011-02-04 14:43:19

0

我能想到的最乾淨的解決方案是傳遞一個鍵/值對的元組來代替。

def log(action, *details): 
    print('object', action, end = '') 
    for var, value in details: 
     print(var, '=', value, end = '') 
    print() 

log("moved", ("from", obj.location), ("dest", new_location)) 

你可以編寫一個捕獲格式字符串並返回另一個函數來實現實際的日誌記錄。如果您要頻繁使用單一格式,這可能會很有用。

def makelogger(*format): 
    def logger(action, *args): 
     print("object", action, format % args) 
    return logger 

logger = makelogger("from = %s dest = %s") 
logger("moved", obj.location, new_location) 

# do a one-off 
makelogger("from = %s dest = %s")("moved", obj.location, new_location) 

只是有些想法。