【问题标题】:Creating variables from Python Dictionary从 Python 字典创建变量
【发布时间】:2017-09-27 23:20:04
【问题描述】:

我正在用 Python 编写自己的小型命令行界面。其中一个命令是“导出”,它基本上创建了一个变量。例如:

> export NUM=15

现在,NUM 将等于“15”。如果我在 CLI 中将“NUM”与任何其他命令一起使用,则它等同于数字“15”,例如我有另一个将十进制转换为十六进制的命令“十六进制”:

> hex NUM

输出应为“F”,但程序无法识别 NUM=15。我在函数之外声明了我的变量字典。我不会发布整个CLI.py,但这里是导出功能。基本上,我需要在变量字典中分配key=value。

def CommandExport(args):
  if (len(args) == 0):
     print(variables)
  else:
     for line in args:
        args = line.split('=')
        ENV = args[0]
        value = args[1]
        if (int(args[1]) == True):
           value = int(value)
        else:
           value = str(value)
        variables[ENV] = (value)
        for ENV, value in variables.items():
           vars()[ENV] = (value)
           return(ENV)
           return(value)
           return(variables)

似乎它应该工作,但它没有。有什么想法吗?

【问题讨论】:

  • return(value) 和 return(variables) 永远不会被执行,因为函数将在第一次调用后返回,return(ENV)。相反,return ENV, value, variables 也不需要括号。
  • @DavidG 即使这样也不正确,因为这些返回语句位于 for 循环中,因此它将在第一次迭代后返回。不过,我认为 OP 实际上根本不需要返回。

标签: python variables dictionary


【解决方案1】:

这段代码有很多问题,很多都是因为对python的一些原理有误解

  • variables: variables 是什么?这是模块命名空间中的某个变量吗

  • args

    对于 args 中的行: args = line.split('=')

在覆盖变量时始终保持警惕。有些语言对每个代码块都有一个作用域,但是在 python 中

  • int

    if (int(args[1]) == True):
       value = int(value)
    else:
       value = str(value)
    

这里要求python将args列表的第二项转换为整数,然后与True比较。只有当args[1] 为integer 1、float 1.0、boolean True 或string '1' 时,此测试才会通过,因为True 的整数值为1。这样的东西会更合适

try:
    value = int(value)
except ValueError:
    pass

这会尝试将其转换为 int,当它失败时,值将保留在 args[1] 中的字符串

总而言之,我认为您需要刷新 Python 基础知识。如果您需要有关此特定问题的帮助,我建议您发布完整的CLI.py,以及如何调用它以及应该做什么的示例。

如果你想解析一个命令及其参数,我会做这样的事情

​

def convert_int(value):
    try:
        return int(value)
    except ValueError:
        return value

def parse_arguments(arguments):
    for arg in arguments:
        key, value = arg.split('=')
        yield key, convert_int(value)

def parse_command(input_string):
    command, *argument_list = input_string.split(' ')
    arguments =dict(parse_arguments(argument_list))
    return command, arguments
parse_command('my_command arg0=a0 arg1=val1 arg2=2')
('my_command', {'arg0': 'a0', 'arg1': 'val1', 'arg2': 2})

然后可以在 Class 中使用此方法来保留您的环境和变量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 2016-11-20
    • 2021-03-05
    • 1970-01-01
    • 2021-06-25
    • 2014-10-01
    • 2019-07-24
    相关资源
    最近更新 更多