В зависимости от того, что вы на самом деле хотите от этих строк, вы можете использовать парсер, например, parsimonious
:
from parsimonious.nodes import NodeVisitor
from parsimonious.grammar import Grammar
grammar = Grammar(
r"""
command = set operand to? number (operator number)* middle? to? numsys? number
operand = (~r"words?" / "speed") ws
middle = (~r"[Ww]ords" / "bits")+ ws number
to = ws "to" ws
number = ws ~r"[-\d.]+" "kts"? ws
numsys = ws ("oct" / "hex") ws
operator = ws "and" ws
set = ~"[Ss]et" ws
ws = ~r"\s*"
"""
)
class HorribleStuff(NodeVisitor):
def __init__(self):
self.cmds = []
def generic_visit(self, node, visited_children):
pass
def visit_operand(self, node, visited_children):
self.cmds.append(('operand', node.text))
def visit_number(self, node, visited_children):
self.cmds.append(('number', node.text))
examples = ['Set word 45 and 46 to hex 331',
'set words 45 and 46 bits 3..7 to 280',
'set word 45 to oct 332',
'set speed to 60kts Words 3-4 to hex 34']
for example in examples:
tree = grammar.parse(example)
hs = HorribleStuff()
hs.visit(tree)
print(hs.cmds)
Это даст
[('operand', 'word '), ('number', '45 '), ('number', '46 '), ('number', '331')]
[('operand', 'words '), ('number', '45 '), ('number', '46 '), ('number', '3..7 '), ('number', '280')]
[('operand', 'word '), ('number', '45 '), ('number', '332')]
[('operand', 'speed '), ('number', '60kts '), ('number', '3-4 '), ('number', '34')]
Возможно, вы захотите изучить концепцию Разделение запросов команд . Я бы не стал беспокоиться о типизированных репозиториях для поиска значений, но я все же, вероятно, использовал бы классы типов DTO над наборами данных и т. Д.
Вы можете потратить некоторое время на чтение блогов Грега Янга, начиная с этого по настоящее время. Он не говорит конкретно о заполнении справочных данных, но часто говорит о том, что не обрабатывает функции чтения / отчетности вашего приложения с помощью типизированных методов в хранилище.
Использование DDD У меня есть нечто похожее со следующим:
interface IAddressService
{
IList<Country> GetCountries ();
IList<State> GetStatesByCountry (string country);
IList<City> GetCitiesByState (string state);
// snip
}
Страна, штат и город - это объекты-ценности, которые поступают из таблицы поиска в базе данных.
Государство и округ являются не объектами, а ценными объектами. Они не являются предметом вашей системы. То, как вы сказали, что обращались с ними ранее, в порядке. Когда вы измените записи штата или округа в своей базе данных, основываясь на изменениях в состоянии вашей доменной модели? Нет, поэтому им не понадобится хранилище.
Вы читаете не ту книгу, если хотите научиться делать DDD, не усложняя его. : -)
Самое простое решение, которое вы предлагаете, подойдет, если оно отвечает вашим потребностям. Инкапсуляция данных адресов в бизнес-объектах может быть настолько простой или сложной, насколько этого требует ваше приложение. Например, объект State имеет отношение один-ко-многим с округом, поэтому сотруднику просто нужно указать округ, если вы решили смоделировать его таким образом. Я бы представил такую сложность только в случае необходимости.
Кроме того, я не думаю, что можно многого добиться, определяя интерфейсы для ваших репозиториев, если только они не существуют ».