Изменение переменной, переданной в качестве аргумента внутри функции - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь создать функцию, которая принимает переменную и, необязательно, тип данных и приглашение в качестве аргументов, затем вызывает input () и назначает входные данные для переменной в аргументах.

def inp(var, prompt='', intype=str):
    var = intype(input(prompt))
    return None

Теперь, если я сделаю это (при условии, что имя x уже определено):

inp(x,'hello',int)

Я хочу напечатать "привет" (эта часть уже работает), а затем преобразовать вводполучил в int и сохранил его в переменной x.

Однако, похоже, он не работает. (требуемое значение не присваивается переменной, переданной в качестве аргумента). Я знаю, что мой код неудобен, так как я могу заставить его работать?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2019

Если вы сделали следующее, это сработало бы, однако вам придется немного изменить сигнатуру функции:

def inp(variableName, prompt='', inttype="str"):
    operation = "global {variable}; {variable} = {cast}(input(prompt))"
    exec(operation.format(variable=variableName, cast=inttype, prompt=prompt))

Так что вам потребуется изменить метод, чтобы он принимал строки в отличие от фактических значений. .

Поэтому, если вы хотите изменить переменную x, вам нужно будет передать строку "x"

Этот тип обертки exec внутри функции.

In [19]:     def inp(variableName, prompt='', inttype="str"):
    ...:         operation = "global {variable}; {variable} = {cast}(input(prompt))"
    ...:         exec(operation.format(variable=variableName, cast=inttype, prompt=prompt))
    ...:

In [20]: inp("x", prompt="hello world", inttype="str")
hello worldbye!

In [21]: print(x)
bye!

Урок в том, что python является динамическим языком, и все возможно :) (однако я бы не рекомендовал это)

0 голосов
/ 02 ноября 2019

Вы можете изменить свой код, как показано ниже, для достижения желаемого результата

def inp(prompt,intype):
    var = intype(input(prompt))
    return var

x = inp("Hello",float)
print(x)

Вы также можете проверить этот поток ( Как передать переменную по ссылке? ), как упоминалосьв одном из комментариев

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...