Почему переменная не присваивается, когда присваивания существуют в обоих предложениях блока if-else? - PullRequest
0 голосов
/ 26 октября 2019

Предположим, у нас есть что-то вроде:

if True:
    r = 0
else:
    r = 1
print(r)

Почему бы нам получить UnboundLocalError: local variable 'r' referenced before assignment?

Фактический код показан ниже:

def rasterize_dot_verify_args(callable, parent):

    if not hasattr(callable, "__call__"):
        raise ValueError()
    import inspect
    siggy = inspect.signature(callable)
    if (len(siggy.parameters) > 1):
        raise ValueError()

def rasterize(callable, xparent, make_copy :bool = False):
    rasterize_dot_verify_args(callable, xparent)

    iparent = xparent
    if make_copy:
        import copy
        iparent = copy.deepcopy(xparent)

    if hasattr(iparent, "__iter__"):
        in_kids = iter(iparent)
        if in_kids != iparent:
            lamby = lambda p, *, c=callable: rasterize(c, p)
            out_kids = map(lamby, in_kids)

            # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            r = callable(out_kids)  # !!!!!!!!!!!!!!!!!!!!
            # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    else:
        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        r = iparent  # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    return r

import itertools as itts
sixify = lambda obj, *, itts=itts: itts.repeat(obj, 6)
inputs = map(sixify, range(1, 5))

# inputs = (_ for _ in [
#      itts.repeat(1, 6),
#      itts.repeat(2, 6),
#      itts.repeat(3, 6),
#      itts.repeat(4, 6)
# ])

print(rasterize(list, inputs))

Я вынужден добавить немного текста сюда, потому что: "Похоже, что ваше сообщение в основном код; пожалуйста, добавьте еще немногоподробнее. "

о боже ... еще больше текста нужно.

Ответы [ 2 ]

1 голос
/ 26 октября 2019

Лучшей характеристикой вашего кода будет:

if test1:
    if test2:
        r = something
else:
    r = something

Что должно сделать очевидным, как вы получите ошибку, которую получили.

1 голос
/ 26 октября 2019

r не будет назначено, если hasattr(iparent, "__iter__") равно True и in_kids! = iparent равно False. Вы должны добавить блок else в оператор if in_kids != iparent:, чтобы присвоить r значение.

...