我想创建一个All Applications > $yourapp > Session management
,其中包含stats_user,stats_password和stats_ui的数据,而不必像这样单独使用它们。我该怎么做呢?
struct
答案 0 :(得分:4)
您可以使用namedtuple
。见这里:https://docs.python.org/3/library/collections.html#collections.namedtuple
类似的东西:
from collections import namedtuple
Stats = namedtuple('Stats', ['user', 'password', 'uri'])
然后,您可以使用位置参数,关键字参数或混合创建一个Stats对象:
s1 = stats(stats_user, stats_password, stats_uri) # positional
s2 = stats(user=stats_user, password=stats_password, uri=stats_uri) # keyword
s3 = stats(stats_user, stats_password, uri=stats_uri)
可以像访问任何其他对象一样访问成员(例如s1.user
)
在您的代码中,您可以使用以下对象之一:
config = templater.haproxy_head.format(**s1._asdict())
答案 1 :(得分:3)
有很多方法可以实现这一目标。您可以创建class,也可以使用dictionary,也可以使用named tuple。
从你的问题中你并不完全清楚你打算如何使用它们,但是对于所有这些解决方案(类,字典,命名元组),你可以将对象作为单个实体传递。
课程是最具表现力的解决方案。您可以定义具有所需属性的类,但也可以附加使用类中数据的方法。类也可以继承自其他类或由其他类组成。
# accept stats as a single argument, but then use each
# piece of data separately
def config(..., stats, ...):
templater.haproxy_head.format(
statsUser = stats.username,
statsPassword=stats.password,
statsURI = stats.uri
)
# define the "Stats" class
class Stats(object):
def __init__(self, username, password, uri):
self.username = username
self.password = password
self.uri = uri
# create a stats object
stats = Stats("homer", "doh", "www.example.com")
...
# pass the object to config
config(..., stats, ...)
命名元组与类非常相似,但设置起来要简单一些。您需要做的就是定义名称和属性列表。你得到的是一个自定义类。
另一个重要的区别是它们是不可变的。创建命名元组后,无法更改其包含的值。
import collections
# accept stats as a single argument, but then use each
# piece of data separately
def config(..., stats, ...):
templater.haproxy_head.format(
statsUser = stats.username,
statsPassword=stats.password,
statsURI = stats.uri
)
# define the Stats named tuple
Stats = collections.namedtuple("Stats", ["username", "password", "uri"])
# create a stats object
stats = Stats("homer", "doh", "www.example.com")
...
# pass the object to config
config(..., stats, ...)
请注意,在实际使用中,类和命名元组是相同的。在这两种情况下,您都使用“点符号”来访问对象的元素(例如:stats.username)。
字典的开销最小。它只是名称与值的映射。
# accept stats as a single argument, but then use each
# piece of data separately
def config(..., stats, ...):
templater.haproxy_head.format(
statsUser = stats["username",
statsPassword=stats["password"],
statsURI = stats["uri"]
)
# define the stats
stats = {
"username": "homer",
"password": "doh",
"uri": "http://www.example.com"
}
# pass them to the config function as a single object
config(..., stats, ...)
字典与类和命名元组的不同之处在于,您通过将项目名称作为键来引用元素(例如:stats [“username”])。
答案 2 :(得分:0)
你可以使用字典:
stats = {user: stats_user, password: stats_password, uri: stats_uri}
然后使用以下内容访问每个:
print(stats["user"])
答案 3 :(得分:0)
在名为config
的函数内为config
分配内容是一个非常糟糕的主意。
Python没有任何称为“struct”的内容,但如果我理解正确,您可以将其放入字典中,并在调用.format
时将其展开:
data = {'statsUser': 'foo', 'statsPassword': 'bar', 'statsURI': 'bat'}
和
def config(apps, groups, data, bind_http_https, ssl_certs, templater):
logger.info("generating config")
config = templater.haproxy_head.format(**data)
答案 4 :(得分:0)
您可以创建自己的类似结构的dict
子类,它是自己的__dict__
。基本概念与ActiveState AttrDict配方的基本概念相同,但实现更简单。结果是可变的,因为实例的属性和它们的值都是可变的。虽然属性未排序,但您可以使用基类keys()
和values()
方法(和/或iterkeys()
和{{1)遍历当前属性和/或其值在Python 2)中。
itervalues()
答案 5 :(得分:0)
我正在回答我的问题以供参考,以下是我的代码现在的样子(这可行并且按照需要行事):
def config(apps, groups, stats_data, bind_http_https, ssl_certs, templater):
logger.info("generating config")
config = templater.haproxy_head.format(**stats_data)
groups = frozenset(groups)
我的结构是一本字典,我按如下方式启动它:
stats_data = {'statsUser': '', 'statsPassword': '', 'statsURI': ''}
我有一个名为args
的参数解析器,这就是我在dict
stats_data['statsUser']= args.stats_user
stats_data['statsPassword']= args.stats_password
stats_data['statsURI']= args.stats_uri