Утверждение нескольких переменных как одного типа - PullRequest
0 голосов
/ 13 ноября 2018

Проблема: У меня есть функция, которая принимает параметры n и base, и я хотел бы заверить, что оба эти параметра на самом деле являются целыми числами.До сих пор я делал следующее:

#  Conditions in which the function makes sense.
assert isinstance(n, (int)), 'n must be an integer. n: {0}'.format(n)
assert isinstance(base, (int)), 'base must be an integer. base: {0}'.format(base)
assert not isinstance(n, bool)

Вопрос: Это кажется утомительным, я хотел бы как-то сделать что-то похожее на assert isinstance((n, base), (int, int)), 'n and base must be integers. n: {0}, base: {1}'.format(n, base).Но это дает мне ошибку AssertionError в неожиданные моменты времени (n и base оба являются int).Возможно, кортежи нельзя использовать?Есть ли аналогичный подход, который действительно работает?

Редактировать: я думаю, что идеальной обработкой было бы перечисление каждого параметра, который должен иметь тип t, и, если один или несколько не пройдены, распечатали только те, которые потерпели неудачу.

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

def pascal(n, base=1):
    """Makes a dictionary where the keys are row-indexes in a pascal-trangle
    of size n, and the values are the rows as a list. E.g. pascal(3) should
    return {1 : [1], 2: [1,1], 3: [1,2,1]}.

    pascal(0) should returns an empty dictionary.

    Optional argument 'base=': set an integer as a new base. E.g.
    pascal(3, base=2) should return {1: [2], 2: [2, 2], 3: [2, 4, 2]}"""

    #  Conditions in which the function makes sense.
    #  assert isinstance((n, base), (int, int)), 'n and base must be integers. n: {0}, base: {1}'.format(n, base)
    assert isinstance(n, (int)), 'n must be an integer. n: {0}'.format(n)
    assert isinstance(base, (int)), 'base must be an integer. base: {0}'.format(base)
    assert not isinstance(n, bool)

    if not n:
        return {}
    if n == 1:
        return {1: [base]} #  The basic case.
    else:
        bottom_row = list()
        prev_p = pascal(n-1, base) #  Only do one recursive call!
        for i in range(0, n):
            if i == 0:
                bottom_row.append(prev_p[n-1][i])
            elif i == n-1:
                bottom_row.append(prev_p[n-1][i-1])
            else:
                bottom_row.append(prev_p[n-1][i-1]+prev_p[n-1][i])
        bottom_row = {n: bottom_row}
        pascal_dict = prev_p
        pascal_dict.update(bottom_row)
        return pascal_dict

1 Ответ

0 голосов
/ 13 ноября 2018

Нет векторизации isinstance.

assert isinstance((n, base), (int, int))

Должно быть

assert isinstance(n, int) and isinstance(base, int)

Если у вас большее количество переменных ...

for var in [n, base, count, blah, foo, bar]:
    assert isinstance(var, int)

Если вам не нужно индивидуальное обслуживание на них:

assert(all(isinstance(var, int) for var in list))
...