2013-12-10 3 views
0

Я пытаюсь изучить Python и немного запутался в скрипте, с которым я играю. Я использую Python для запуска scapy. Существуют некоторые условные утверждения, которые проверяют определенные значения. Моя путаница сосредоточена на проверке значений. Надеюсь, что я правильно использую атрибуты и методы. Я все еще пытаюсь понять встроенные функции против того, что включено в scapy. Я использую Powershell в основном в течение последних нескольких лет, поэтому его трудно переключать передачи :)Понимание атрибутов и методов Python

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): 

Первый условный оператор, как представляется, проверьте атрибут «тип». Почему в этом случае они будут использовать функции Python, встроенные в функции str() и type()? Если я просто использую type(), он вытаскивает то же значение.

Для второго и третьего условных операторов, похоже, используются методы, встроенные в scapy. Какова логика включения скобок() во внешние выражения? Опять же, если я запускаю их вручную, я получаю правильное значение.

+2

Ответы на все ваши вопросы, к сожалению, состоят в том, что это чрезвычайно унииоматический и непифонический код. Я не могу представить, почему кто-нибудь напишет это. –

+0

Кстати, вы имеете в виду «scapy» или «scrapy»? – Jon

+0

Подумайте о том, чтобы разместить свой код на http://codereview.stackexchange.com/ для получения полной информации о питоническом стиле. – Jon

ответ

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 интерпретатор представляет значение для вас (по телефону __repr__()). За исключением базовых типов, которые имеют буквальные обозначения, такие как целые числа, строки или последовательности, представление объекта не обязательно совпадает с его значением (или тем, что вы наберете, чтобы воссоздать тот же самый объект).

Итак, когда вы делаете

>>> foo = type(42) 
>>> foo 
<type 'int'> 

интерпретатор печатает '<type 'int'>', но результат вызова actualy int, встроенный типа для целых чисел:

>>> type(42) == int 
True 
>>> type(42) == "<type 'int'>" 
False 

Кроме того, считаю, что это :

Библиотеки или инструменты, написанные для оказания помощи в конкретной области знаний, часто пишутся экспертами в этих областях - не обязательно ex perts в Python. На мой взгляд, вы часто это видите в научных библиотеках (например, matplotlib и numpy). Это не значит, что они плохие библиотеки, но они часто не являются хорошим источником вдохновения для питонического стиля.

+0

Благодарим за помощь! Часть вашего объяснения нечеткая, но это потому, что я относительно новичок в Python. – user2565554

0

Не проверяйте тип, сравнивая str(type(obj)) == 'ClassName'.

Вы должны использовать isinstance(obj, Class), или для None вы просто пишете if obj is None.

Смежные вопросы