我正在尝试学习Python,并且对我正在玩的脚本感到有点困惑。我正在使用Python来发布scapy。有一些条件语句可以测试某些值。我的困惑集中在如何检查值。我希望我正确使用术语属性和方法。我仍然试图找出内置功能与scapy中包含的功能。我过去几年一直在使用Powershell,所以很难换档:)
tcp_connect_scan_resp = sr1(IP(dst=dst_ip)/TCP(sport=src_port,dport=dst_port,flags="S"),timeout=10)
if(str(type(tcp_connect_scan_resp))=="<type 'NoneType'>"):
Print "Closed"
elif(tcp_connect_scan_resp.haslayer(TCP)):
if(tcp_connect_scan_resp.getlayer(TCP).flags == 0x12):
第一个条件语句似乎是检查属性“type”。在这种情况下,为什么他们会使用Python内置的str()
和type()
函数?如果我只使用type()
,它会拉出相同的值。
对于第二个和第三个条件语句似乎使用scapy中内置的方法。将括号()包含在语句外部的逻辑是什么?再次,如果我手动运行它们,我会得到正确的值。
答案 0 :(得分:0)
第二个陈述,围绕if
陈述的表达的范围,只是不必要和坏的风格。
第一句话需要更详细的解释:
if(str(type(tcp_connect_scan_resp))=="<type 'NoneType'>"):
这将检查tcp_connect_scan_resp
所属类型的字符串表示是否等于“”。这是一种糟糕的类型检查形式,使用方式很糟糕。在某些情况下可能需要进行类型检查,但通常您应该尝试在Python中避免使用它(请参阅duck typing)。如果必须,请使用isinstance()
。
在Python内置类型None
的情况下,惯用的方法是写
if foo is None
现在,您自己使用type()
获得“相同结果”的原因是,如果您在交互式Python shell中输入某些内容,则解释器代表您的值(通过致电__repr__()
)。除了具有文字符号的基本类型(如整数,字符串或序列)之外,对象的表示与其值(或者您为重新创建该对象而键入的内容)不一定相同。
所以,当你这样做时
>>> foo = type(42)
>>> foo
<type 'int'>
解释器打印'<type 'int'>'
,但调用的结果是实际的int
,内置的整数类型:
>>> type(42) == int
True
>>> type(42) == "<type 'int'>"
False
另外,请考虑一下:
为帮助特定专业领域而编写的库或工具通常由这些领域的专家编写 - 不一定是Python专家。在我看来,您经常在科学图书馆中看到这一点(例如matplotlib
和numpy
)。这并不意味着它们是糟糕的图书馆,但它们往往不是Pythonic风格的好灵感。
答案 1 :(得分:0)
不要通过比较str(type(obj)) == 'ClassName'
来检查类型。
您应该使用isinstance(obj, Class)
,或者您只需编写if obj is None
。