2017-05-05 251 views
1

我在其中一個python腳本中遇到了一些奇怪的行爲。python意想不到printType中的NoneType

我有一個函數可以計算交換機端口上最後一個接口的連接日期。

def last_change(self): 
    """ 
    Gets the date from the last time the interface status changed. 
    ifLastChange time is relevant to sysUpTime and should thus be calculated as: sysUpTime-ifLastChange/100 
    The ifLastChange and sysUpTime values are `Ticks` and should be handled as UNIX-Time 
    :return: Date as string. Format DD.MM:YYYY hh:mm:ss 
    """ 
    self.snmp_obj.mib = 'IF-MIB' 
    self.snmp_obj.mib_object = 'ifLastChange' 
    self.snmp_obj.match = self.ifindex 
    snmp_response = self.snmp_obj.snmp_get_specific() 
    sys_ticks = Switch.uptime(self) 
    int_ticks = snmp_response[1].strip("'") 
    tick_diff = int(sys_ticks) - int(int_ticks) 
    chtime = datetime.timedelta(seconds=tick_diff/100) 
    print((datetime.datetime.today() - chtime).strftime('%d.%m.%Y %H:%M:%S')) 
    return str((datetime.datetime.today() - chtime).strftime('%d.%m.%Y %H:%M:%S')) 

我打電話給我的interface對象的功能在我的代碼如下:

  print(interface.last_change()) 
      print('HOSTNAME: ' + device_hostname + 
          '\nUSERNAME: ' + device_user + 
          '\nIFNAME: ' + ifname + 
          '\nIFINDEX: ' + ifindex + 
          '\nBPI: ' + bpi + 
          '\nIFSTATUS: ' + ifstatus + 
          '\nVLAN: ' + ifvlan + 
          '\nMAC: ' + mac_address + 
          '\nTRUNKSTATUS: ' + trunk_status + 
          '\nPORTSEC_STATE: ' + interface.portsec_state() + 
          '\nPORTSEC_STATUS: ' + interface.portsec_status() + 
          '\nMAXMAC: ' + interface.max_macaddresses() + 
          '\nLAST_CHNAGE: ' + interface.last_change()) 

現在有趣的是,print(interface.last_change())的作品,但在「大」 print()功能將引發一個錯誤。

02.07.2016 10:09:27 
Traceback (most recent call last): 
    File "portfynder.py", line 171, in <module> 
    main() 
    File "portfynder.py", line 140, in main 
    '\nLAST_CHNAGE: ' + interface.last_change()) 
TypeError: must be str, not NoneType 

如在輸出端看到的上方,print(interface.last_change())作品,並且還返回一個str值(02.07.2016 10:09:27)。但由於某種原因,它會在大print()函數中返回NoneType

我不知道爲什麼會發生這種情況,有什麼想法?

回答

1

它是由與錯誤提到的值不同的值導致的,當您將多條線分割爲多條時,Python無法指向特定部分,因此它會選取最後一條線。

print('1: ' + '1' + 
     '\n2: ' + '2' 
     '\n3: ' + None + 
     '\n4: ' + '4' + 
     '\n5: ' + '5') 

Traceback (most recent call last): 
    File "D:\Python Scripts\test.py", line 8, in <module> 
    '\n5: ' + '5') 
TypeError: must be str, not NoneType 

相同

print('1: ' + '1' + '\n2: ' + '2' + '\n3: ' + None + '\n4: ' + '4' + '\n5: ' + '5') 

Traceback (most recent call last): 
    File "D:\Python Scripts\test.py", line 4, in <module> 
    print('1: ' + '1' + '\n2: ' + '2' + '\n3: ' + None + '\n4: ' + '4' + '\n5: ' + '5') 
TypeError: must be str, not NoneType 

所以,你需要找出哪些其他值都造成None。我也建議使用str.format,因爲它沒有任何字符串連接的問題。所以即使None獲得通過,你仍然可以在輸出中看到它。否則,你必須將None的值賦給一個字符串來連接它。

print('1: {}\n2: {}\n3: {}\n4: {}\n5: {}' 
     .format('1', '2', None, '4', '5')) 

1: 1 
2: 2 
3: None 
4: 4 
5: 5