Как я могу сделать разбор строк в Python менее громоздким? - PullRequest
0 голосов
/ 12 мая 2018

Извинения, если заголовок вопроса слишком расплывчатый - приветствуются изменения.

Я пытаюсь проанализировать XML с помощью BeautifulSoup, но поскольку каждый вызов функции может возвращать None, мне нужно проанализировать один элемент надколичество строк.Это становится громоздким очень быстро:

books_count = result.books_count

if not books_count:
    return None

books_count = books_count.string

if not books_count:
    return None

books_count = int(books_count)

if not books_count:
    return None

Делать то же самое в Swift, языке, с которым я гораздо лучше знаком, гораздо чище:

guard let booksCountString = result.booksCount?.string,
    let booksCountInt = Int(booksCountString) else {
    return nil
}

Есть ли подобноеКак я мог сделать это в Python?Я хочу избежать использования try / catch, так как это может привести к тому, что в моем коде постоянно будут появляться ошибки времени выполнения, это не очень хорошая практика.

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Если вы представляете свою последовательность None проверок, используя лямбда с, например:

check_1 = lambda r: r.books_count
check_2 = lambda r: r.string
check_3 = lambda r: int(r)

Тогда мы можем обобщить решение для любого числа этих проверок.Эта функция в некотором роде похожа на то, как работает functools.reduce :

def my_reduce(fs, arg, stop_value=None):
    res = arg
    for f in fs:
        res = f(res)
        if res == stop_value:
            return stop_value
    return res

Затем используйте ее следующим образом:

my_reduce([check_1, check_2, check_3], good_value)
Out[1]: 42

my_reduce([check_1, check_2, check_3], bad_value) is None
Out[2]: True
0 голосов
/ 12 мая 2018

Может быть, в цикле?

example = [result.books_count, books_count.string, int(books_count)]

for n in example: if not n : return None

Только что проверил, и цикл for работает нормально, пока result.books_count, books_count.string, int(books_count) не вызывает ошибок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...