Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 30, 2020 14:04:45

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

выход из цикла

ffrr
все три ваши функции
user, pazz, maria должны возвращать значение, вместо изменения глобальных переменных



Офлайн

#2 Окт. 30, 2020 14:08:20

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

выход из цикла

а почему нельзя использовать глобальные переменные?

Офлайн

#3 Окт. 30, 2020 14:24:28

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

выход из цикла

ffrr
а почему нельзя использовать глобальные переменные?
Смысл функций в том, чтобы 1) сделать код более структурированным 2) использовать код повторно
Структурирование помогает справиться с проблемой закона Миллера, уменьшая количество сущностей, которыми опреирует алгоритм. Повторное использование позволяет переиспользовать свой или чужой код. Ваши функции не решают ни одну из этих задач. Они не могут быть переиспользованы, так как жестко привязанны к модулю через глобальные переменные. И они не уменьшают сложность, так как нет выделенной ответственности функции - ответственность распространяется на весь модуль.



Офлайн

#4 Окт. 30, 2020 14:26:24

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

выход из цикла

можно простенький пример привести для любой функции?

Офлайн

#5 Окт. 30, 2020 14:36:35

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

выход из цикла

    
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()
А вот это говнокод.



Офлайн

#6 Окт. 30, 2020 14:43:03

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

выход из цикла

спасибо, так действительно красиво и изящно получается.

Офлайн

#7 Окт. 30, 2020 15:05:51

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

выход из цикла

попробовал избавиться от исключений при вводе неверного 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

Офлайн

#8 Окт. 30, 2020 17:18:22

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

выход из цикла

избавился от исключений после импортирования явно таких модулей:

 import pyinputplus
import pysimplevalidate

и изменил строку
 username = pyinputplus.inputNum('Username (must be 12 numbers): ', min=111111111111, max=999999999999, limit=3)

Офлайн

#9 Окт. 30, 2020 18:02:54

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

выход из цикла

изменил функции, теперь при выполнении скрипта

 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 не определена?

Офлайн

#10 Окт. 30, 2020 20:12:29

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

выход из цикла

ну стало быть в 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 (книгу) мне кажется что метод тыка менее эффективен



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Окт. 30, 2020 20:26:08)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version