连接字符串文字以生成变量名
Concatenate string literals to generate variable name
问题
在 python
中,shortest/easiest 创建函数的方法是什么,该函数允许我通过连接两个字符串文字来生成变量名称来访问变量?
背景
在C
中,我可以这样做:
#define CONCAT(x,y) x ## _ ## y
然后,稍后在我的代码中,我可以做类似的事情:
int i = CONCAT(PRODUCT,BANANA).
假设存在一个名为 PRODUCT_BANANA 的宏,其值现在分配给 i
。我可以通过间接在 shell 脚本中完成类似的事情。
问题 - Redux
如何在 python
中实现相同的功能?我这样做是因为我有一个 python
class,其中包含针对数十种不同产品的数千个变量,即
class A(object):
BANANA_ADDRESS0 = 0xABCD;
PINEAPPLE_ADDRESS0 = 0x1234;
BANANA_ADDRESS1 = 0x4567;
PINEAPPLE_ADDRESS1 = 0x1000;
我希望能够有一个函数,例如,可以通过 someFunc("BANANA", "ADDRESS0")
执行,将值解析为 A.BANANA_ADDRESS0
,并 return 关联值(0xABCD
,在这种情况下)。
额外
假设上述情况可行,是否可以让函数始终将提供的函数参数解释为字符串文字,这样函数调用就不需要用 single/double 引号括起来的参数?也就是说,它可以通过 someFunc(BANANA, ADDRESS0)
调用,而不是 someFunc("BANANA", "ADDRESS0")
?
如果您只想对 class/instance 个属性执行此操作,则需要 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))
对于您的 "extra" 块 - 好吧,BANANA
表示一个名为 BANANA
的变量,而不是文字字符串。如果你真的想要,你可以定义这样一个字符串常量,但我不会。没有什么好的方法可以告诉 Python 总是假设一个未解析的变量名实际上意味着一个字符串文字,我认为如果可以的话这样做是个坏主意。
第一部分很简单:
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'
等等
只需使用一个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]
问题
在 python
中,shortest/easiest 创建函数的方法是什么,该函数允许我通过连接两个字符串文字来生成变量名称来访问变量?
背景
在C
中,我可以这样做:
#define CONCAT(x,y) x ## _ ## y
然后,稍后在我的代码中,我可以做类似的事情:
int i = CONCAT(PRODUCT,BANANA).
假设存在一个名为 PRODUCT_BANANA 的宏,其值现在分配给 i
。我可以通过间接在 shell 脚本中完成类似的事情。
问题 - Redux
如何在 python
中实现相同的功能?我这样做是因为我有一个 python
class,其中包含针对数十种不同产品的数千个变量,即
class A(object):
BANANA_ADDRESS0 = 0xABCD;
PINEAPPLE_ADDRESS0 = 0x1234;
BANANA_ADDRESS1 = 0x4567;
PINEAPPLE_ADDRESS1 = 0x1000;
我希望能够有一个函数,例如,可以通过 someFunc("BANANA", "ADDRESS0")
执行,将值解析为 A.BANANA_ADDRESS0
,并 return 关联值(0xABCD
,在这种情况下)。
额外
假设上述情况可行,是否可以让函数始终将提供的函数参数解释为字符串文字,这样函数调用就不需要用 single/double 引号括起来的参数?也就是说,它可以通过 someFunc(BANANA, ADDRESS0)
调用,而不是 someFunc("BANANA", "ADDRESS0")
?
如果您只想对 class/instance 个属性执行此操作,则需要 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))
对于您的 "extra" 块 - 好吧,BANANA
表示一个名为 BANANA
的变量,而不是文字字符串。如果你真的想要,你可以定义这样一个字符串常量,但我不会。没有什么好的方法可以告诉 Python 总是假设一个未解析的变量名实际上意味着一个字符串文字,我认为如果可以的话这样做是个坏主意。
第一部分很简单:
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'
等等
只需使用一个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]