2016-07-21 5 views
0

Я так и не понял. Я думаю, что это утверждение if, это позволяет запускать функцию, когда она вызывается, а не когда модуль, в котором он написан, импортируется. Возьмите этот код, например:пытается понять __self__ == "__main__"

# Finds duplicate values in a specified feature class field and populates those reords with a 'Y' in another field 

import arcpy 

# enter program inputs 
def findDupes(inFeatureClass, checkField, updateField, countRec = 0): 
    with arcpy.da.SearchCursor(inFeatureClass, [checkField]) as rows: 
     values = [r[0] for r in rows] 

    with arcpy.da.UpdateCursor(inFeatureClass, [checkField, updateField]) as rows: 
     for row in rows: 
      if values.count(row[0]) >= 2: 
       row[1] = 'Y2' 
       print "yes" 
      rows.updateRow(row) 
      countRec += 1 
      print countRec 
if __name__ == '__main__': 
    fc = raw_input("paste input feature class path from ArcCatolog: ") 
    fld = raw_input("duplicate field values: ") 
    up = raw_input("update field: ") 

    findDupes(fc, fld, up) 

модуль дуги не имеет значения для этого вопроса; однако, способ, которым я вижу вещи, если я поместил исходные входы в начало скрипта, он все равно будет работать, но если бы я импортировал скрипт с этой функцией в качестве модуля (import CheckforDupes), он будет работать с оператором import вместо когда функция была вызвана, если не было __name__ == "__main__". Это правильно?

+2

В вашем названии вы хотели поставить '__self__ == '__main''? (В отличие от '__name__ == '__main'' –

+4

http://stackoverflow.com/questions/419163/what-does-if-name-main-do –

+0

Нет. Довольно я имел в виду, если __name__ ==' __main__ ' – ShaunO

ответ

0

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

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

+0

Это то, что я хочу. Я пытаюсь использовать функцию в скрипте после импорта его в качестве модуля и теперь получаю эту ошибку: {Traceback (последний последний вызов): Файл «<интерактивный вход>», строка 1, в Файл «N: \ Python \ Completed scripts \ Check_for_Dupes.py», строка 16, в findDupes countRec + = 1 UnboundLocalError: локальная переменная 'countRec', на которую ссылаются перед назначением.} Я назначил countRec как глобальный, прежде чем он – ShaunO

+0

Почему вы объявляете 'countRec' вне' findDupes() '? Он не используется нигде, так почему бы не просто pu t внутри функции? –

+0

попытался использовать его внутри и передать его как параметр (см. Отредактированный код). Также попытался поставить глобальную перед ним внутри функции. Он используется второй раз сразу после rows.updateRow. Тот же результат при вызове из интерактивного окна. – ShaunO

Смежные вопросы