【问题标题】:How do I get user input to refer to a variable in Python?如何获取用户输入以引用 Python 中的变量?
【发布时间】:2010-06-17 02:04:24
【问题描述】:

我想让用户输入来引用我的代码中的一些列表。我认为它被称为命名空间?那么,假设他们输入“list1”或“list2”,我必须对这段代码做什么才能打印用户输入的任何内容?

list1 = ['cat', 'dog', 'juice']
list2 = ['skunk', 'bats', 'pogo stick']

x = raw_input('which list would you like me to print?')

我计划有很多这样的列表,所以一系列 if...then 语句似乎不守规矩。

【问题讨论】:

  • 仅供参考,命名空间用于不同的东西。

标签: python list namespaces raw-input


【解决方案1】:

在我现在能想到的情况下,最好有一本包含您希望用户能够参考的内容的字典,例如:

my_dict = {
    'list1': ['cat', 'dog', 'juice']
    'list2': ['skunk', 'bats', 'pogo stick']
}

key = raw_input('which list would you like me to print?')

print my_dict[key]

其实你可以利用内置的globals(),像这样:

list1 = ['cat', 'dog', 'juice']
list2 = ['skunk', 'bats', 'pogo stick']
x = raw_input()

print globals()[x]

【讨论】:

  • +1 我完全同意。请注意,globals() 函数将为您提供一个包含所有全局变量的字典,但当您打算像这样使用它时,通常最好使用您自己的字典。
  • @David 当您发表评论时,我正在编辑我的帖子以添加有关 globals() 的信息,但我同意拥有自己的字典可能是一个更好的主意。
  • 从安全的角度来看,公开内部变量是非常值得怀疑的。如果此代码位于安全边界附近(运行 suid、用于 Web 应用程序等),则 globals() 方法是一个非常糟糕的计划。
  • @everyone,感谢您的回复。我不想使用列表(而不是字典)的原因是因为其中一些列表应该具有相同的内容。您是否建议解决此问题?我希望 list1 和 list2 可能相同,但让用户帮助确定要打印的内容。
  • @slartibartfast 我完全同意。使用 globals() 几乎总是一个坏主意,特别是如果它涉及到用户输入。无论如何,我只是想找到一种方法来回答(技术上)somefreakingguy 的问题,同时表明如果你的选择有限,最好建立自己的字典。
【解决方案2】:

使用 dict 的总体思路很好,但最好的具体实现可能是这样的:

def pick_one(prompt, **kwds):
  while True:
    x = raw_input(prompt)
    if x in kwds:
      return kwds[x]
    else:
      print 'Please choose one of: ',
      for k in sorted(kwds): print k,
      print

要使用,例如:

print pick_one('which list would you like me to print?',
    list1 = ['cat', 'dog', 'juice']
    list2 = ['skunk', 'bats', 'pogo stick'])

关键是,当您要求用户从有限的几种可能性中选择一种时,您总是希望检查选择 其中之一(它是在都容易拼错等),如果没有,准确提示(给出可用选项列表)并给用户另一个机会。

所有类型的改进(例如,有最大尝试次数,之后您决定用户不能输入并随机选择一个;-)保留为(不太难但也不太有趣; -) 读者练习。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    相关资源
    最近更新 更多