打印中的Python意外NoneType()

时间:2017-05-05 11:01:13

标签: python-3.x

我在我的一个python脚本中遇到了一些奇怪的行为。

我有一个函数可以计算交换机端口上接口的最后连接日期。

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)。但由于某种原因,它会在大NoneType函数中返回print()

我不知道为什么会这样,有什么想法?

1 个答案:

答案 0 :(得分:1)

它是由一个不同的值None引起的,而不是错误提到的值,当你将一条线分割成多个时,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