引号中的Python变量值

时间:2012-03-28 10:04:06

标签: python string variables variable-assignment quotes

我正在编辑一个脚本,该脚本通过openstack keystone进行身份验证以获取令牌。 API-Call有效,但我想使用变量而不是直接值来使其更具可读性和可重用性。但问题是值必须是引号(“)并且我无法弄清楚如何做到这一点。我发现一些代码示例[1],[2]一般在字符串中使用变量但是我需要使用某种转义序列将值放在引号中。

目前我的字符串赋值如下:

params = '{"auth":{"passwordCredentials":{"username":"nodermatt", "password":"feelfree"}, "tenantId":"4"}}'

正如您所看到的,用户名,密码和tenantID的值都在引号中,我希望用变量替换它们:

osuser = "nodermatt"
ospassword = "feelfree"
ostenant = "4"

params = '{"auth":{"passwordCredentials":{"username":osuser, "password":ospassword}, "tenantId":ostenant}}'

如果可以解决这个“问题”,我会很高兴。

PS:如果我在Google上错过了与我的问题匹配的帖子或搜索结果,我会非常感谢这个链接。

提前致谢! 最好的祝福, 尼古拉斯

[1] Subprocess in Python Add Variables

[2] http://ubuntuforums.org/showthread.php?t=786879

4 个答案:

答案 0 :(得分:7)

此特定情况的最简单解决方案是首先定义Python字典,然后使用json.dumps()将其转换为JSON:

osuser = "nodermatt"
ospassword = "feelfree"
ostenant = "4"

d = {"auth": 
        {"passwordCredentials": {"username": osuser, "password": ospassword},
         "tenantId": ostenant}}
params = json.dumps(d)

答案 1 :(得分:2)

您是否尝试过使用格式字符串?

params = '{"auth":{"passwordCredentials":{"username":%s, "password":%s}, "tenantId":%s}}' % (osuser, ospassword, ostenant)

答案 2 :(得分:1)

您正在寻找格式字符串,如下所示:

'{"username": "%s", "password":"%s"}' % (osuser, ospassword)

如果要替换许多变量,可能需要使用扩展 语法:

values = {'osuser': "nodermatt",
    'ospassword': "feelfree",
    'ostenant': 4}
params =  '''{"auth":{"passwordCredentials":{"username":"%(osuser)s",
"password":"%(ospassword)s"}, "tenantId":"%(ostenant)d"}}''' % values

请注意,您只需将模板字符串中的引号放在要显示的位置即可。我将ostenant变为一个整数作为示例,但您也可以将其视为字符串(在dict和模板字符串中)。

答案 3 :(得分:0)

这里有一个python库:https://github.com/openstack/python-keystoneclient

它使用Sven建议的JSON编码。

来自自述文件:

# use v2.0 auth with http://example.com:5000/v2.0")
>>> from keystoneclient.v2_0 import client
>>> keystone = client.Client(username=USERNAME, password=PASSWORD, tenant_name=TENANT, auth_url=KEYSTONE_URL)
>>> keystone.tenants.list()
>>> tenant = keystone.tenants.create(name="test", descrption="My new tenant!", enabled=True)
>>> tenant.delete()