Скорее всего, Scope работает по-разному в Databricks по сравнению с Visual Studio (для того же кода Python) - PullRequest
1 голос
/ 05 апреля 2020

Вот моя проблема:

У меня точно такой же код (скопированный), который я запускаю локально в коде Visual Studio, а также в Databricks. По какой-то причине это работает на коде Visual Studio, но не на Databricks. Вот ошибка, которую я получаю в Databricks:

local variable 'ret' referenced before assignment

Ошибка указывает на -> print(ret) (см. Ниже). Не должно быть никаких проблем с областью действия, поскольку мой print ret находится вне моего оператора if then else.

Я пытался поиграть с разными отступами, но ничего не работает. У кого-нибудь есть ключ? (ps: у меня нет доступа к Python версиям на БД, так как это не моя личная учетная запись, поэтому я прошу решение, чтобы справиться с текущей средой, которая у меня есть)

Вот выдержка кода, который работает на коде Visual Studio, но не на Databricks. В нем много кода, но я просто хочу проверить с вами общую структуру . Я создал упрощенную модель ниже.

        for FX_ext in ['', 'full_FX_', 'USD_FX_']: 
            for bt_type, field in trafo_dict.items():       
                MPs = val[field].values
                MPs_null = MPs.copy()
                MPs_null[0] = np.nan

            for period in ['1d', 'Nd']:
                #print(MPs_null[shifts[period]]) #########

                if FX_ext == '':
                    try:
                        ret = MPs_null[shifts[period]] / MPs[:-1]
                    except:
                        print()
                        pass

                elif FX_ext == 'USD_FX_':
                     usd = sp_list['FX_rates_USD']
                     ret = np.array(MPs_null[shifts[period]]).astype(float) * np.array(usd[shifts[period]]).astype(float) / \
                          np.array(np.array(MPs[:-1]).astype(float)*np.array(usd[:-1])).astype(float) ## Hallelujah :D
                else:
                    c= dict()
                    retlst = []
                    for curr in ['USD', 'EUR', 'GBP']:
                        c = sp_list[f'FX_rates_{curr}']
                        retlst.append(
                                np.array(MPs_null[shifts[period]]).astype(float) * np.array(c[shifts[period]]).astype(float) / \
                                np.array((np.array(MPs[:-1]).astype(float)*np.array(c[:-1]).astype(float))) )# Jesus christ finally succeded to resolve this issue
                    ret = functools.reduce(np.minimum, retlst)
                print(ret) 

Целое является частью большой функции и одинаково происходит, когда я запускаю его как целую систему.

Я пытался протестировать аналогичную и упрощенную структуру на Databricks , чтобы проверить, не было ли ничего принципиально неправильного в моих Databricks и Python версиях, и это сработало (без проблем):

a = 5

for period in [1, 3]: 
    if a ==5:
      b = a + period
    elif a >5:
      b = 48
    else:
      b=0
    print(b)

Output:
6
8

Спасибо за вашу помощь

...