Я бы сказал, что номер один Гоча пытается написать статически типизированный код на динамическом языке.
Не стесняйтесь использовать идентификатор для указания на строку, а затем список в автономных разделахкод
keys = 'foo bar foobar' # Imagine this coming in as an argument
keys = keys.split() # Now the semantically chose name for the argument can be
# reused As the semantically chosen name for a local variable
не стесняйтесь обращаться с функциями как с обычными значениями: они есть.Возьми следующий парсер.Предположим, что мы хотим обрабатывать все теги заголовка одинаково, а теги ul - как теги ol.
class Parser(HTMLParser):
def __init__(self, html):
self.feed(html)
def handle_starttag(self, tag, attrs):
parse_method = 'parse_' + tag
if hasattr(self, parse_method):
getattr(self, parse_method)(attrs)
def parse_list(self, attrs):
# generic code
def parse_header(self, attrs):
# more generic code
parse_h1 = parse_h2 = parse_h3 = parse_h4 = parse_h5 = parse_h6 = parse_header
parse_ol = parse_ul = parse_list
Это можно сделать, используя менее общий код в методе handle_starttag
в языке, подобном java, отслеживаякакие теги соответствуют тому же методу, но затем, если вы решите, что хотите обрабатывать теги div, вы должны добавить это в логику диспетчеризации.Здесь вы просто добавляете метод parse_div
и все готово.
Не проверяйте тип! Утиный тип!
def funtion(arg):
if hasattr(arg, 'attr1') and hasattr(arg, 'attr2'):
foo(arg):
else:
raise TypeError("arg must have 'attr1' and 'attr2'")
вместо isinstance(arg, Foo)
.Это позволяет вам передавать любой объект с attr1
и attr2
.Это позволяет вам, например, передать класс трассировки, обернутый вокруг объекта, в целях отладки.Вам придется изменить класс, чтобы сделать это в Java AFAIK.
Как указал THC4k, другой (более питонический) способ сделать это - идиома EAPF .Мне это не нравится, потому что я люблю ловить ошибки как можно раньше.Тем не менее, это более эффективно, если вы ожидаете, что код будет редко давать сбой.Никому не говорите, что мне это не нравится, хотя наши перестанут думать, что я знаю, как писать на Python.Вот пример любезности THC4k.
try:
foo(arg):
except (AttributeError, TypeError):
raise InvalidArgumentError(foo, arg)
Это вопрос о том, должны ли мы ловить AttributeError
и TypeError
или просто позволить им распространяться куда-то, кто знает, как с ними обращаться, но этопросто пример, поэтому мы позволим ему летать.