Форум сайта python.su
0
Здравствуйте.
Я пытаюсь изменить значения аргументов функции, заданные по умолчанию, из командной строки с помощью функции input(). Я хочу сделать это именно так и знаю, что можно (возможно, даже нужно) сделать иначе. Тем не менее, интересно именно так. Я пробовал достать словарь, представляющий пространство имен функции изнутри самой функции при помощи
function_name.__dict__
def defaults(a=11, b=22): for default in locals(): eval('{0} = int(input({0}))'.format(default)) # пусть ключ служит подсказкой для ввода
Отредактировано NotImplemented (Авг. 12, 2017 18:39:19)
Прикреплённый файлы:
Снимок экрана от 2017-08-12 18-10-24.png (64,5 KБ)
Офлайн
186
Python второй, в третьем атрибуты другие
>>> def foo(a=11, b=10): ... print a, b >>> foo() 11 10 >>> foo.func_defaults = (20, 30) >>> foo() 20 30
Офлайн
0
Rodegast вариант хороший, спасибо. Вот только этот атрибут возвращает кортеж, который, будучи неизменяемым, вынудит создать промежуточный объект для вводимых значений, ведь их надо получать от пользователя по одному, выводя подсказку на экран к каждому из них. Это эквивалентно созданию отдельного словаря внутри функции для хранения значений по умолчанию, что маленько не то, чего я хочу. Возможно, это и нельзя сделать.
Если я правильно понимаю, пространство имен реализовано в виде словаря. Обыконвенным присвоением в коде я могу добавлять в этот словарь записи. Но не выходит добавить их через input(), что не дает мне покоя. Ведь должен же быть способ, это же очевидная вещь. Может, это специально сделано так для защиты от дурака?
Офлайн
186
Не путай значение по умолчанию и пространство имён. С input - ом нет никакой проблемы.
>>> def foo(a=11, b=10): ... a = input("") ... b = input("") ... print a, b ... >>> foo() 4 5 4 5
Офлайн
294
NotImplementedм-м- не совсем, у класса function есть атрибут __defaults__ в котором собственно и храняться значения по умолчанию. можно использовать func_defaults а можно напрямую , но поскольку кортежи неизменяемые обьекты то вам придеться каждый раз создавать новый кортеж и связывать его с атрибутом __defaults__
Если я правильно понимаю, пространство имен реализовано в виде словаря.
[code python][/code]
Офлайн
0
Rodegast в твоем примере имена умолчаний захардкожены, плюс пришлось бы писать их в аргументе input()'а еще раз для подсказки. Функция же знает собственное пространство имен, в котором хранятся умолчания, зачем их переписывать по три раза? Надо только извлечь их имена и значения. Я хочу что-то вроде
def defaults(a=11, b=22): for default in locals(): exec('{0} = int(input({0}))'.format(default))
Отредактировано NotImplemented (Авг. 12, 2017 21:43:36)
Офлайн
0
PEHDOMДа я это понял уже:
можно использовать func_defaults а можно напрямую , но поскольку кортежи неизменяемые обьекты то вам придеться каждый раз создавать новый кортеж и связывать его с атрибутом __defaults__
NotImplemented
Вот только этот атрибут возвращает кортеж, который, будучи неизменяемым, вынудит создать промежуточный объект для вводимых значений, ведь их надо получать от пользователя по одному, выводя подсказку на экран к каждому из них.
PEHDOMАга, про это я и пишу в первом сообщении в теме, только там не то что бы нет эффекта, а скорее эффект странный:
Можно получить словарь вызвав locals() внутри функции но любые изменения этого словаря не будут иметь никакого эффекта.
NotImplemented
Также пытался использовать locals() вопреки запрету в официальной документации на изменение словаря, возвращаемого ею. Она ведет себя странным образом (см. приложенное изображение).
Офлайн
294
NotImplementedон не странный, у вас в локальном пространстве имен три переменных, a и b которые являються аргументами функции и default которой вы передаете значения в цикле.
Ага, про это я и пишу в первом сообщении в теме, только там не то что бы нет эффекта, а скорее эффект странный:
[code python][/code]
Офлайн
0
PEHDOM точно, вы правы. Будь у меня способ преобразовать строку, содержащую имя переменной в само имя переменной, и я бы заставил программу работать именно так, как хочу.
Отредактировано NotImplemented (Авг. 12, 2017 22:12:00)
Офлайн
221
NotImplemented
>>> a = 1 >>> b = eval('a') + 1 >>> b 2
Офлайн