Я обнаружил, что делаю что-то подобное, нужно преобразовать адреса с порядковыми номерами («Третий St») в формат, который может постигнуть геокодер («Третий St»). Хотя это не очень элегантно, одним быстрым и грязным решением является использование inflect.py для создания словаря для перевода.
Функция inflect.py имеет функцию number_to_words()
, которая превратит число (например, 2
) в его текстовую форму (например, 'two'
). Кроме того, существует функция ordinal()
, которая будет принимать любое число (цифра или форма слова) и превращать его в его порядковую форму (например, 4
-> fourth
, six
-> sixth
). Ни один из них сам по себе не выполняет то, что вы ищете, но вместе вы можете использовать их для создания словаря для перевода любого предоставленного порядкового номера-слова (в пределах разумного диапазона) в соответствующий порядковый номер. Взгляните:
>>> import inflect
>>> p = inflect.engine()
>>> word_to_number_mapping = {}
>>>
>>> for i in range(1, 100):
... word_form = p.number_to_words(i) # 1 -> 'one'
... ordinal_word = p.ordinal(word_form) # 'one' -> 'first'
... ordinal_number = p.ordinal(i) # 1 -> '1st'
... word_to_number_mapping[ordinal_word] = ordinal_number # 'first': '1st'
...
>>> print word_to_number_mapping['sixth']
6th
>>> print word_to_number_mapping['eleventh']
11th
>>> print word_to_number_mapping['forty-third']
43rd
Если вы готовы посвятить некоторое время, возможно, будет возможно изучить внутреннюю работу inflect.py в обеих этих функциях и создать свой собственный код, чтобы сделать это динамически (Я не пытался это сделать).
Вы можете просто сделать Node
общедоступным и сохранить внутренние производные классы. Не имея отношения к этому, вы должны думать о том, чтобы не выводить Node
во вложенные классы для лучшей ремонтопригодности:
public abstract class Node {
}
internal class ANode : Node {
public byte[] internalValue;
}
internal class BNode : Node {
public int internalValue;
}
Если вы хотите иметь возможность создавать экземпляры ANode
и BNode
из внешних сборок , вы можете использовать абстрактный завод:
public static class NodeFactory {
public Node CreateNode(byte[] value) {
return new ANode { internalValue = value };
}
public Node CreateNode(int value) {
return new BNode { internalValue = value };
}
}
public
и вложенныеinternal
. Я думал, что вся иерархия должна делиться доступом. – Bercovici Adrian 13 July 2018 в 12:00