2013-06-25 95 views
2

我有两个问题:是否可以在另一个变量的赋值中赋值变量?

1)我想写像声明:superVar = [subVar1 = 'a', subVar2 = 'b']

这一说法后,我想:

superVar = ['a', 'b']

subVar1 = 'a'

subVar2 = 'b'

这是索姆可以在python中实现吗?

2)我想要做一个类的初始化函数中执行以下操作:

self.superVar = [v1 = 'a', v2 = 'b']

这一说法后,我想:

self.superVar = ['a', 'b']

self.superVar.v1 = 'a'

self.superVar.v2 = 'b'

即'superVar'是其他变量名称的一部分。

正如你可能已经猜到的,我真正想做的是(2)以上。 (1)只是第一步,如果(2)是不可能的,即使如此,我也会很高兴。

非常感谢! Gaurav

+0

#1是不可能的。 #2并不是完全可能的,但近似可能是一个丑陋的黑客。为什么你觉得有必要这样做,而不是单独分配变量,以便? – BrenBarn

+0

子变量共同构成一个逻辑单元。例如假设superVar表示电话簿条目,并且子变量是名字,姓氏等等。所以我想将对应于相同逻辑单元的子变量保持在一起。我希望子变量名称包含超级变量名称,因为这些变量可能会在类之外单独修改。所以有人可以从外部分配superVar.v1 ='c'。我可以写出完整的长名,但这会使它看起来有点丑陋/笨重。 – user10

+1

你可以做1)'superVar = ['a','b']; subVar1,subVar2 = superVar;' – SheetJS

回答

2

你是指字典吗?

superVar = {'subVar1': 'a', 'subVar2': 'b'} 
superVar['subVar1'] 
# 'a' 
superVar['subVar2'] 
# 'b' 

在一类:

class Foo(object): 
    def __init__(self, a, b): 
     self.superVar = {'subVar1' : a, 'subVar2' : b} 


bar = Foo('one', 'two') 
bar.superVar.values() 
# ['one', 'two'] 

如果你想维持秩序,您可以使用从集合模块的ordered dictionary

+0

不,我关心superVar中变量的顺序。我试图实现的基本目标是使代码紧凑并易于阅读。 (顺便说一下,我没有投票你的答案)。 – user10

+1

@TheNoob如果您关心订单,您可以随时使用[订购的字典](http://docs.python.org/2/library/collections.html#collections.OrderedDict) – TerryA

+0

感谢Haidro。不知道这一点。我会看一看。 – user10

2

在Python中,赋值是语句,而不是表达式。你不能将陈述链接在一起。所以(1)是不可能的。
但是,您可以使用keyword arguments一类的__init__方法来获取(2)行为:

>>> class Test: 
     def __init__(self, **kwargs): 
      print "the keyword arguments are", kwargs #kwargs is a dictionary 
      for x in kwargs: 
       setattr(self, x, kwargs[x]) #adds an attribute from kwargs to self 

>>> t = Test(var1=1234,var2='hello',var3=45.234) 
the keyword arguments are {'var1': 1234, 'var3': 45.234, 'var2': 'hello'} 
>>> t.var1 
1234 
>>> t.var2 
'hello' 
>>> t.var3 
45.234 
>>> 
+0

我知道关键字参数。但是,我有大量的变量。所以我的计划是在init中定义所有变量,然后该类的用户可以覆盖他/她想要的变量。因此,我不能走这条路。 – user10

2

为什么不创建一个字典您subVars,使superVar值的列表从subVar字典?

d = {'subVar1': 'value1', 'subVar2': 'value2'} 
superVar = d.values() 
3
>>> from collections import namedtuple 
>>> T = namedtuple('supervar', ['v1', 'v2']) 
>>> superVar = T('a', 'b') 
>>> superVar.v1 
'a' 
>>> superVar.v2 
'b' 
+0

+1为理智的解决方案 – John

1

这是基本相同边沁的答案,

class T: 

    def __init__(self): 
     self.SuperVar = {'v1':'a', 'v2':'b'} 
     print self.SuperVar.v1 
     print self.SuperVar.v2 

    def __setattr__(self, k, v): 

     class SuperVar: 
      def __setattr__(self, k, v): 
       self.__dict__[k] = v 

     if k == "SuperVar": 
      self.__dict__["SuperVar"] = SuperVar() 
      for k in v: 
       self.__dict__["SuperVar"].__setattr__(k, v[k]) 
     else: 
      self.__dict__[k] = v 


t = T()