Продолжайте получать глобальное имя не определено ошибка

1
def defineType(riskCode):
    if riskCode == 1:
        riskType = High
    else:
        if riskCode == 2:
            riskType = Moderate
        else:
            if riskCode == 3:
                riskType = Low
            else:
                if RiskCode == 4:
                    riskType = No

Это часть программы, над которой я работаю для класса...

# Global Variables
custName = input('Please enter your name: ')
custAge = int(input('Please enter your age: '))
custViolation = int(input('Please enter the number of violations: '))

riskCode = 0
estimatePrice = 0
riskType = none

Это моя глобальная переменная...

Traceback (most recent call last):
  File "C:\Users\Alli\Downloads\HwyRobbery.py", line 13, in <module>
    riskType = none
NameError: name 'none' is not defined

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

Любая помощь будет принята с благодарностью.

Спасибо! Алли

  • 1
    Правильно отформатируйте код
Теги:
variables
global

6 ответов

11

Это None не None. Python чувствителен к регистру.

8

Первоначальная проблема, которую я вижу, заключается в том, что none не является значением built- в Python. none.

Кроме того, башня вложенных операторов if в первой функции не нужна. Сгладьте это!

def defineType(riskCode):
    if riskCode == 1:
        riskType = High
    elif riskCode == 2:
        riskType = Moderate
    elif riskCode == 3:
        riskType = Low
    elif RiskCode == 4:
        riskType = No

Это не ошибка, но она намного читаема, нет? (Легче вводить тоже:)

Кроме того, я полагаю, что High, Moderate, Low и No определены в другом месте вашего кода? Если вы используете их как перечисляемые константы (т.е. Как набор уникальных целых чисел, значения которых не изменяются), High, Moderate, Low и No будут более идиоматичными.

И на самом деле, если вы это сделали, вся функция может быть устранена следующим образом:

HIGH = 1
MODERATE = 2
LOW = 3
NO = 4

Теперь вам не нужно отображать их вообще; и вы можете просто назначить riskCode riskType, хотя теперь это может быть немного лишним!

riskType = riskCode

Если вы хотите получить строки из кодов риска, попробуйте второй словарь от ответа Арциома Рудзенки.

Наконец... Я бы предложил помещать эти коды в собственное пространство имен:

class Risk(object):
    HIGH = 1
    MODERATE = 2
    LOW = 3
    NO = 4

Затем вы можете ссылаться на них следующим образом:

if riskCode == Risk.HIGH: do_something()

Теперь вы можете использовать короткие слова, такие как No для других вещей.

  • 0
    Также (извините за рой словоблудия!) Смотрите ответ jlargent, если вы пытаетесь изменить riskType как глобальный в своей функции.
  • 0
    Я очень ценю вашу помощь, после того, как вы сделали то, что вы предложили, изменив none на None и используя elif вместо if ..., я получаю thisTraceback (последний вызов был последним): Файл "C: \ Users \ Alli \ Downloads \ HwyRobbery. py ", строка 79, в файле <module> main ()" C: \ Users \ Alli \ Downloads \ HwyRobbery.py ", строка 16, в главном файле assignRisk ()" C: \ Users \ Alli \ Downloads \ HwyRobbery. py ", строка 37, в assignRisk defineType (riskCode) Файл" C: \ Users \ Alli \ Downloads \ HwyRobbery.py ", строка 70, в defineType riskType = Moderate NameError: глобальное имя 'Moderate' не определено
Показать ещё 4 комментария
3

Нет необходимости использовать функцию для использования функции для сопоставления рисков, вы можете просто использовать следующее:

riskmapping = {1:High, 2:Moderate, 3:Low, 4:No}

Но в случае, если High,... No не является экземплярами или переменными, а просто строками, чем:

riskmapping = {1:'High', 2:'Moderate', 3:'Low', 4:'No'}

Использование:

highRisk = riskmapping[1]

Или

if riskmapping[currentRiskCode]:
    #do smth
  • 0
    NameError: имя 'High' не определено
  • 0
    Я предполагаю, что Alli OGrady является новичком в python (извините, если нет!), Поэтому я думаю, что вы должны показать использование.
Показать ещё 4 комментария
1

Кроме того, мой вклад в простоту:

riskCodes = {1: 'High', 2: 'Moderate', 3: 'Low', 4: 'No'}

def defineType(riskCode):
    riskType = riskCodes[riskCode]
1

Если вы изменяете глобальные переменные в функции, отличной от той, которая была объявлена, не вам нужно использовать глобальное ключевое слово.


def defineType(riskCode):
    global riskType

    if riskCode == 1:
        riskType = High



  • 0
    хорошая мысль, я не осознавал, что это было целью ОП.
  • 0
    Переход от кода, который вообще не работает, к коду, который очень плохо спроектирован, не обязательно является шагом в правильном направлении. В 95% случаев ключевое слово global означает, что вы делаете что-то ужасно, ужасно неправильно.
0

Настройка riskType внутри вашей функции является локальной для этой функции и не влияет на значение в глобальном. Вы должны сообщить своей функции, чтобы использовать глобальное значение, помещая global riskType перед кодом, который пытается его изменить.

None следует загладить.

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

Python имеет elif для else if.

Исправленный код:

# Global Variables
riskCode = 0
estimatePrice = 0
riskType = None

def defineType(riskCode):
    global riskType
    if riskCode == 1:
        riskType = "High"
    elif riskCode == 2:
        riskType = "Moderate"
    elif riskCode == 3:
        riskType = "Low"
    elif RiskCode == 4:
        riskType = "No"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню