我在我的一个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()
。
我不知道为什么会这样,有什么想法?
答案 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