将3个变量清理为1个结构

时间:2016-02-01 15:09:09

标签: python

我想创建一个All Applications > $yourapp > Session management ,其中包含stats_user,stats_password和stats_ui的数据,而不必像这样单独使用它们。我该怎么做呢?

struct

6 个答案:

答案 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)

  1. 在名为config的函数内为config分配内容是一个非常糟糕的主意。

  2. Python没有任何称为“struct”的内容,但如果我理解正确,您可以将其放入字典中,并在调用.format时将其展开:

  3. 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