连接字符串文字以生成变量名称

时间:2017-12-22 19:45:40

标签: python python-2.7 variables variable-names

问题

python中,创建一个允许我通过连接两个字符串文字来生成变量名称来访问变量的函数的最短/最简单方法是什么?

背景

C中,我可以这样做:

#define CONCAT(x,y) x ## _ ## y

然后,在我的代码中,我可以做类似的事情:

int i = CONCAT(PRODUCT,BANANA).

假设存在名称为PRODUCT_BANANA的宏,其值现已分配给i。我可以通过间接在shell脚本中完成类似的事情。

问题 - Redux

如何在python中完成相同的功能?我这样做是因为我有一个python类,有数千种不同产品的变量,即

class A(object):
    BANANA_ADDRESS0 = 0xABCD;
    PINEAPPLE_ADDRESS0 = 0x1234;
    BANANA_ADDRESS1 = 0x4567;
    PINEAPPLE_ADDRESS1 = 0x1000;

我希望能够拥有一个功能,例如,可以通过someFunc("BANANA", "ADDRESS0")执行,将值解析为A.BANANA_ADDRESS0,并返回相关值(0xABCD ,在这种情况下)。

附加

假设以上是可能的,是否可以让函数始终将提供的函数参数解释为字符串文字,因此函数调用不需要包含在单引号/双引号中的参数?即所以它可以通过someFunc(BANANA, ADDRESS0)来调用,而不是someFunc("BANANA", "ADDRESS0")

3 个答案:

答案 0 :(得分:3)

第一部分很简单:

class A(object):
    BANANA_ADDRESS0 = 0xABCD;
    PINEAPPLE_ADDRESS0 = 0x1234;
    BANANA_ADDRESS1 = 0x4567;
    PINEAPPLE_ADDRESS1 = 0x1000;

    @classmethod
    def some_func(cls, name_a, name_b):
        name = '{}_{}'.format(name_a, name_b)
        return getattr(cls, name)

value = A.some_func('BANANA', 'ADDRESS1')

但是第二部分是不可能的,除非你有一组有限的名字,在这种情况下你也必须有

BANANA = 'BANANA'
PINEAPPLE = 'PINEAPPLE'

答案 1 :(得分:2)

如果您只想对类/实例属性执行此操作,则需要getattr。它需要一个字符串参数,您可以按照自己喜欢的方式构建它:

getattr(A, "BANANA" + "_" + "ADDRESS0")

如果你愿意的话,你当然可以写一个简单的包装,但在我看来,这样做是没有任何好处的。

以任意方式构建传递给getattr的字符串,包括使用其他构造,如for循环(如果适用)。例如,假设您拥有属性名称的元素的可迭代,并且想要全部获取它们:

for first_part in first_parts:
   for second_part in second_parts:
       print(getattr(A, first_part + "_" + second_part))

对于“额外”块 - 好吧,BANANA表示名为BANANA的变量,而不是文字字符串。如果你真的想要,你可以定义这样一个字符串常量,但我不会。没有好的方法告诉Python总是假设一个未解析的变量名实际上意味着一个字符串文字,我认为如果可以的话,这样做是个坏主意。

答案 2 :(得分:1)

只需使用dict即可。即。

A = {
    "BANANA_ADDRESS0": 0xABCD,
    "PINEAPPLE_ADDRESS0": 0x1234,
    "PINEAPPLE_ADDRESS1": 0x1000
} 

然后你可以这样做:

var1 = "BANANA" # or any other value
var2 = "ADDRESS0" # or any other value
myValue = A[var1 + "_"  + var2]