如何通过python的input()函数传递对象而不是字符串?

时间:2019-03-22 15:28:04

标签: python jupyter-notebook

我正在研究一个机器学习建模问题,其中创建了一个对象来存储训练和验证数据,但是验证集是可选的,如果在创建对象时不包括在内,则默认值为None

如果稍后我们发现尽管用户想要添加验证熊猫数据框,我们希望让他们使用input()提供数据框的名称。有了在笔记本中正确定义的函数,我们就可以运行,然后可以执行eval(<input>)将字符串转换为所需的对象。如果我们在笔记本之外定义对象,则似乎范围未包含该变量。

我意识到这可能不是执行此操作的最佳方法,那么还有什么更Python化的方法可以让用户在实例化对象之后按名称提供数据框?我们可以将对象作为函数的参数很好地传递。是否可以通过input()传递类似对象的方法,或者通过其他一些用户友好的方式来提示用户?

1 个答案:

答案 0 :(得分:1)

也许可以将locals()globals()用作dict,以使用其名称来获取已初始化的变量。

the_variable = {'key_one': 'val_one'}

selected_input = input("Please input a variable name")
selected_var = locals()[selected_input]

print("selected_var continence -> {0}".format(selected_var))

应该输出,并假设the_variable已传递给input()

selected_var continence -> {'key_one': 'val_one'}

这是对Calling a function of a module by using it's name a string的回答的变体,但是似乎在这种情况下也可以工作。


更新

我不记得我在哪里获取了以下 perversion (虽然我确实在看),但我不建议它在生产中使用。但是...

questionable_response = lambda message: input("{message}: ".format(message = message))

this_response = json.loads(questionable_response("Input some JSON please"))
# <- '{"Bill": {"person": true}, "Ted": {"person": "Who is asking?"}}'

...确实允许类似 input的对象。

input ted json str处获取数据看起来像...

this_response['Bill']
# -> {u'person': True}

this_response['Ted'].get('person')
# -> u'Who is asking?'

...但是,您可能会发现将以上内容与其他脚本化组件一起使用时会遇到一些问题。

对于Unicode转换,在此主题上有一些预先张贴的answers。检查help(json.loads)会发现,存在{em> toggles 用于parse_floatintconstant s的切换。

即使这样做也不值得,因为如果尝试实现这种时髦,仍然会遇到一些奇怪的事情。

只列举一些;

  • 连词是不能;假设您得到了一个聪明的Clara,他输入了 '{"Clara": {"person": "I'll not be labelled!"}}' 之类的内容。除非'转义,否则将导致错误。 \'

  • 上面的内容也很脆弱;也许键盘上的某人没有足够的饮料来尝试 "{'Jain': {'person': True}}" 。首先将 barf 用引号引起来,然后从True而不是true

因此,就像我在此更新开始时开头一样,我不会在生产中推荐这样做;可能会花费大量时间追逐边缘情况。我之所以分享它,是因为也许您没有找到任何其他选择来使从input到可以被查询的对象。

相关问题