Форум сайта python.su
Хочу спросить на счет данной ошибки, из за чего она возникает, его я ошибся или совсем что то не верно(что скорее всего). Суть задачи скрипта = есть конфиг, в него надо вносить изменения пользователем через input. Нужно чтобы была проверка на параметры в которых только путь до папки, и только да\нет можно написать (+ еще скорее всего надо для параметров только с цифрами сделать проверку, но я пока незнаю как, если будет оказана помощь еще и в этом, буду очень благодарен). Дак вот я сделал функция на проверку имеется ли папка в системе, создал словарь со всеми параметрами и их значениями (если делать только для проверки папки, все работает хорошо, проблема именно в параметрами да\нет). Вот собственно говоря суть проблемы, спасибо заранее добрым людям которые помогут) Скриншот конфига и сам код скрипта приложены с посту.
# -*- coding: utf-8 -*- import os path = '/test3.conf' name1 = input('what setting you to change? ') value1 = input('what you want to change in this setting: ') def set_parametrs(name1, value1): with open(path) as f: current_config = f.read().splitlines() for i, option in enumerate(current_config): if option.split("=")[0].strip() == name1: current_config[i] = '%s = %s' % (name1, value1) with open(path, 'w') as f: f.write('\n'.join(current_config)) f.close() def check_dir(): if os.path.isdir(value1): print('we have this dir') return True else: print('we dont have this dir') return False def check_yes_no(): for key, value in d.items(): if name1 == key and value1 in d[key]: print('this parametr is valid') return True else: print('this parametr is invalid') return False d = { 'backup_destination_automake': ('yes', 'no'), 'backup_destination_prefix': ('yes', 'no'), 'backup_schedule': ('yes', 'no'), 'backup_keep_on_errors': ('yes', 'no'), 'method_rsync_sudo': ('yes', 'no'), 'method_rsync_differential': ('yes', 'no'), 'method_verify': ('yes', 'no'), 'method_device_eject': ('yes', 'no'), 'report_remote_uri_down': ('yes', 'no'), 'report_stdout': ('yes', 'no'), 'report_stdout_on_errors': ('yes', 'no'), 'report_email': ('yes', 'no'), 'report_email_on_errors': ('yes', 'no'), 'report_email_rcpt': ('yes', 'no'), 'report_html': ('yes', 'no'), 'report_html_on_errors': ('yes', 'no'), 'report_html_logo': ('yes', 'no'), 'backup_source': check_dir, 'backup_destination': check_dir, 'backup_exclude': check_dir } '''param_dir = { 'backup_source': check_dir, 'backup_destination': check_dir, 'backup_exclude': check_dir }''' if name1 and value1 and d[name1]: set_parametrs(name1, value1) elif check_yes_no: set_parametrs(name1, value1) else: print("bad")/code]
Отредактировано temzza (Дек. 20, 2018 00:27:14)
Прикреплённый файлы: test3.conf (5,5 KБ)
Офлайн
if name1 and value1 and d[name1](): # ??? set_parametrs(name1, value1) elif check_yes_no: set_parametrs(name1, value1) else: print("bad")
Traceback (most recent call last): File "conf3.py", line 55, in <module> if name1 and value1 and d[name1](): NameError: name 'name1' is not defined
if name1 in d and d[name1] == value1
Отредактировано vic57 (Дек. 20, 2018 00:11:11)
Офлайн
vic57прощу прощение, начало кода не скопировал
# -*- coding: utf-8 -*- import os path = '/Users/test/test3.conf' name1 = input('what setting you to change? ') value1 = input('what you want to change in this setting: ')
Офлайн
vic57обновил начальный пост, добавил начало+убрал ()
if name1 in d and d[name1] == value1
if name1 and value1
Офлайн
зачем так?
если ты хочешь изменить параметр то
d = { 'backup_destination_automake': ('yes', 'no'), 'backup_destination_prefix': ('yes', 'no'), 'backup_schedule': ('yes', 'no'), 'backup_keep_on_errors': ('yes', 'no'), 'method_rsync_sudo': ('yes', 'no'), 'method_rsync_differential': ('yes', 'no'), 'method_verify': ('yes', 'no'), 'method_device_eject': ('yes', 'no'), 'report_remote_uri_down': ('yes', 'no'), 'report_stdout': ('yes', 'no'), 'report_stdout_on_errors': ('yes', 'no'), 'report_email': ('yes', 'no'), 'report_email_on_errors': ('yes', 'no'), 'report_email_rcpt': ('yes', 'no'), 'report_html': ('yes', 'no'), 'report_html_on_errors': ('yes', 'no'), 'report_html_logo': ('yes', 'no'), 'backup_source': check_dir, 'backup_destination': check_dir, 'backup_exclude': check_dir } '''param_dir = { 'backup_source': check_dir, 'backup_destination': check_dir, 'backup_exclude': check_dir }''' for k,v in d.items(): s = input(k + '|'.join(v) + ' (y/n/q[uit])?:') if s == 'y': d[k] = 'yes' elif s == 'n': d[k] = 'no' elif s =='q': break else: continue
Офлайн
vic57спасибо за способ) но я хотел уточнить, обязательно чтобы была проверка как когда меняю путь у папки, скрипт проверял что пишет именно путь, и также с да\нет, только да нет, и только для тех вариантов которым надо да нет.
зачем так?если ты хочешь изменить параметр то
Офлайн
ну в таком случае раздели проверку параметров типа yes/no и типа path на два разных цикла
в консоли ты просто запутаешься
Офлайн
vic57То что запутаюсь это не слишком страшно, главное задача чтобы работала правильно проверка на правильность указания параметра. Чтобы для одних параметров только да\нет, а для других только путь
ну в таком случае раздели проверку параметров типа yes/no и типа path на два разных циклав консоли ты просто запутаешься
Офлайн
вот и раздели
d1 = { 'backup_destination_automake': ('yes', 'no'), 'backup_destination_prefix': ('yes', 'no'), 'backup_schedule': ('yes', 'no'), 'backup_keep_on_errors': ('yes', 'no'), 'method_rsync_sudo': ('yes', 'no'), 'method_rsync_differential': ('yes', 'no'), 'method_verify': ('yes', 'no'), 'method_device_eject': ('yes', 'no'), 'report_remote_uri_down': ('yes', 'no'), 'report_stdout': ('yes', 'no'), 'report_stdout_on_errors': ('yes', 'no'), 'report_email': ('yes', 'no'), 'report_email_on_errors': ('yes', 'no'), 'report_email_rcpt': ('yes', 'no'), 'report_html': ('yes', 'no'), 'report_html_on_errors': ('yes', 'no'), 'report_html_logo': ('yes', 'no') } d2 = { 'backup_source': check_dir, 'backup_destination': check_dir, 'backup_exclude': check_dir }
Офлайн
vic57я пробовал делать с . разделением , но видимо тоже где то накосячил
вот и раздели
# -*- coding: utf-8 -*- import os path = '/test3.conf' name1 = input('what setting you to change? ') value1 = input('what you want to change in this setting: ') def set_parametrs(name1, value1): with open(path) as f: current_config = f.read().splitlines() for i, option in enumerate(current_config): if option.split("=")[0].strip() == name1: current_config[i] = '%s = %s' % (name1, value1) with open(path, 'w') as f: f.write('\n'.join(current_config)) f.close() def check_dir(): if os.path.isdir(value1): print('we have this dir') return True else: print('we dont have this dir') return False d = { 'backup_destination_automake': ('yes', 'no'), 'backup_destination_prefix': ('yes', 'no'), 'backup_schedule': ('yes', 'no'), 'backup_keep_on_errors': ('yes', 'no'), 'method_rsync_sudo': ('yes', 'no'), 'method_rsync_differential': ('yes', 'no'), 'method_verify': ('yes', 'no'), 'method_device_eject': ('yes', 'no'), 'report_remote_uri_down': ('yes', 'no'), 'report_stdout': ('yes', 'no'), 'report_stdout_on_errors': ('yes', 'no'), 'report_email': ('yes', 'no'), 'report_email_on_errors': ('yes', 'no'), 'report_html': ('yes', 'no'), 'report_html_on_errors': ('yes', 'no'), 'report_html_logo': ('yes', 'no'), } param_dir = { 'backup_source': check_dir, 'backup_destination': check_dir, 'backup_exclude': check_dir } def check_yes_no(): for key, value in d.items(): if name1 == key and value1 in d[key]: print('this parametr is valid') return True else: print('this parametr is invalid') return False '''if name1 and value1 and d[name1] == check_dir(): set_parametrs(name1, value1) elif check_yes_no(): set_parametrs(name1, value1) else: print("bad")''' if name1 and value1 and param_dir[name1]() and name1 in d == check_yes_no(): set_parametrs(name1, value1) else: print("Bad input")
Офлайн