Найти - Пользователи
Полная версия: выход из цикла
Начало » Python для новичков » выход из цикла
1 2 3 4 5
FishHook
ffrr
все три ваши функции
user, pazz, maria должны возвращать значение, вместо изменения глобальных переменных
ffrr
а почему нельзя использовать глобальные переменные?
FishHook
ffrr
а почему нельзя использовать глобальные переменные?
Смысл функций в том, чтобы 1) сделать код более структурированным 2) использовать код повторно
Структурирование помогает справиться с проблемой закона Миллера, уменьшая количество сущностей, которыми опреирует алгоритм. Повторное использование позволяет переиспользовать свой или чужой код. Ваши функции не решают ни одну из этих задач. Они не могут быть переиспользованы, так как жестко привязанны к модулю через глобальные переменные. И они не уменьшают сложность, так как нет выделенной ответственности функции - ответственность распространяется на весь модуль.
ffrr
можно простенький пример привести для любой функции?
FishHook
    
def validate_username(username):
    if len(username) < 3:
        return False
    return True 
def get_username():
     username = input('Enter username')
     return username
username = get_username()
if not validate_username(username):
    print 'Error'
    sys.exit()

это допустимый код. Каждая функция имеет одну ответственность и инкапсулирует какую-то конкретную логику. Функция get_username может работать из любого модуля, ей вообще плевать на весь остальной код. С другой строны программе все равно откуда функция берет данные - из консоли, из базы, или рандомно выдумывает. Код использует результат функции и не знает, о том, как оно реализовано. То же касается и другой функции.

 username = ''
is_valid = None
def validate_username():
    global username
    global is_valid
    if len(username) < 3:
        is_valid = False
    else:
        is_valid = True
def get_username():
     global username
     username = input('Enter username')
get_username()
validate_username()
if no tis_valid:
    print 'Error'
    sys.exit()
А вот это говнокод.
ffrr
спасибо, так действительно красиво и изящно получается.
ffrr
попробовал избавиться от исключений при вводе неверного username таким образом:
 for i in range(3):
        test += 1
        try:
                user()
        except pysimplevalidate.ValidationException:
                print('Reboot-1')
        except pysimplevalidate.RetryLimitException:
                print('Reboot-2')
        dbuser, dbpass = data

и таким:
 for i in range(3):
        test += 1
        try:
                user()
        except ValidationException:
                print('Reboot-1')
        except RetryLimitException:
                print('Reboot-2')
        dbuser, dbpass = data

но при запуске все равно они появляются:
  # ./auth.py 
-------------------------
<<<<<<<<<Welcome>>>>>>>>>
-------------------------
Please enter a username (after 3 unlucky attempts system will reboot)
Username (must be 12 numbers): dsgf
'dsgf' is not a number.
Username (must be 12 numbers): sf
'sf' is not a number.
Username (must be 12 numbers):ggag 
'ggag' is not a number.
Traceback (most recent call last):
  File "/storage/.local/lib/python3.8/site-packages/pysimplevalidate/__init__.py", line 512, in validateNum
    numericValue = int(value)
ValueError: invalid literal for int() with base 10: 'ggag'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/storage/.local/lib/python3.8/site-packages/pyinputplus/__init__.py", line 167, in _genericInput
    possibleNewUserInput = validationFunc(
  File "/storage/.local/lib/python3.8/site-packages/pyinputplus/__init__.py", line 385, in <lambda>
    validationFunc = lambda value: pysv.validateNum(
  File "/storage/.local/lib/python3.8/site-packages/pysimplevalidate/__init__.py", line 514, in validateNum
    _raiseValidationException(_("%r is not a number.") % (_errstr(value)), excMsg)
  File "/storage/.local/lib/python3.8/site-packages/pysimplevalidate/__init__.py", line 222, in _raiseValidationException
    raise ValidationException(str(standardExcMsg))
pysimplevalidate.ValidationException: 'ggag' is not a number.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "./auth.py", line 47, in <module>
    user()
  File "./auth.py", line 28, in user
    username = pyip.inputNum('Username (must be 12 numbers): ', min=111111111111, max=999999999999, limit=3)
  File "/storage/.local/lib/python3.8/site-packages/pyinputplus/__init__.py", line 398, in inputNum
    return _genericInput(
  File "/storage/.local/lib/python3.8/site-packages/pyinputplus/__init__.py", line 188, in _genericInput
    raise limitOrTimeoutException
pyinputplus.RetryLimitException
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "./auth.py", line 48, in <module>
    except pysimplevalidate.ValidationException:
NameError: name 'pysimplevalidate' is not defined
ffrr
избавился от исключений после импортирования явно таких модулей:
 import pyinputplus
import pysimplevalidate

и изменил строку
 username = pyinputplus.inputNum('Username (must be 12 numbers): ', min=111111111111, max=999999999999, limit=3)
ffrr
изменил функции, теперь при выполнении скрипта
 for i in range(3):                                                            
                                                                              
        def get_username():                                                   
                username = pyinputplus.inputNum('Username (must be 12 numbers): ', min=111111111111, max=999999999999, limit=3)
                return username                                                                                                
                                                                                                                               
        def validate_username(username):                                                                                       
                if len(username) < 3:                                                                                          
                        return False                                                                                           
                return True 
        test += 1
        try:
                username = get_username()
                print(username)
        except pyinputplus.RetryLimitException:
                print('Reboot-2')
        dbuser, dbpass = data
        print(dbuser)
        print(username)
        if username == dbuser :
...........................................

выдает:
 # ./auth.py
-------------------------
<<<<<<<<<Welcome>>>>>>>>>
-------------------------
Please enter a username (after 3 unlucky attempts system will reboot)
Username (must be 12 numbers): db
'db' is not a number.
Username (must be 12 numbers): sag
'sag' is not a number.
Username (must be 12 numbers): sn
'sn' is not a number.
Reboot-2
Traceback (most recent call last):
  File "./auth.py", line 80, in <module>
    print(username)
NameError: name 'username' is not defined

не понятно почему это переменная username не определена?
AD0DE412
ну стало быть в 80 строке при обращении к ‘username’ интопретатор обнаруживает что такого имени в текущем пространстве имен нет
предположу что это происходит от того што место где это должно происходить исключается при выполнении
 for i in range(3):                                                            
                                                                              
        def get_username():                                                   
                username = pyinputplus.inputNum('Username (must be 12 numbers): ', min=111111111111, max=999999999999, limit=3)
                return username                                                                                                
                                                                                                                               
        def validate_username(username):                                                                                       
                if len(username) < 3:                                                                                          
                        return False                                                                                           
                return True 
        test += 1
        try:
                username = get_username()
                print(username)
        except pyinputplus.RetryLimitException:
                # вот здезь вы присваеваете ‘username’ в рукопашную или еще как либо обрабатываете исключение т.е. обрабатывете тот факт что код в блоке try не работает по причине pyinputplus.RetryLimitException
                print('Reboot-2')
        dbuser, dbpass = data
        print(dbuser)
        print(username)
        if username == dbuser :
...........................................
зы а зачем вы в for засунули тело функций (% если вы хотели их использывать то в for их нужно вызывать не кхм описывать
ззы если вам это (ваш проэкт) не срочен лучше отложите его и прочтите что то по python (книгу) мне кажется что метод тыка менее эффективен
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB