2008-11-17 40 views

Trả lời

35

Như tham chiếu trong Stack Overflow   câu hỏi Inplace substitution from ConfigParser, bạn đang tìm kiếm cho eval():

print eval('self.post.id') # Prints the value of self.post.id 
+0

vâng .. cảm ơn rất nhiều. –

+2

Tại sao không sử dụng setattr()? – danger89

14

Ngoài ra, có các globals() hàm trong Python trả về một từ điển có tất cả các biến được xác định. Bạn cũng có thể sử dụng một cái gì đó như thế này:

print globals()["myvar"] 
45

Lưu ý: làm không sử dụng eval trong bất kỳ trường hợp bạn đang nhận được tên để tìm kiếm từ người dùng nhập dữ liệu vào. Ví dụ: nếu điều này xuất phát từ trang web, không có gì ngăn mọi người xâm nhập:

__import__("os").system("Some nasty command like rm -rf /*") 

làm đối số. Tốt hơn là giới hạn các vị trí tra cứu được xác định rõ như từ điển hoặc cá thể sử dụng getattr(). Ví dụ, để tìm giá trị "bài" trên tự, sử dụng:

varname = "post" 
value = getattr(self, varname) # Gets self.post 

Tương tự như vậy để thiết lập nó, sử dụng setattr():

value = setattr(self, varname, new_value) 

Xử lý fully qualified names, như "post.id", bạn có thể sử dụng chức năng như dưới đây thay cho getattr()/setattr().

def getattr_qualified(obj, name): 
    for attr in name.split("."): 
     obj = getattr(obj, attr) 
    return obj 

def setattr_qualified(obj, name, value): 
    parts = name.split(".") 
    for attr in parts[:-1]: 
     obj = getattr(obj, attr) 
    setattr(obj, parts[-1], value) 
+2

+1. Tôi chắc chắn khuyên bạn nên sử dụng getattr() và setattr() – ayaz

14

Bạn có thể làm một cái gì đó giống như những gì Geo đề nghị, hoặc đi với:

>>> wine = 'pinot_noir' 
>>> vars()[wine] = 'yum' 
>>> pinot_noir 
'yum' 

Lưu ý: vars() và globals() đều giống nhau, tôi chỉ quen sử dụng vars () Tôi ngạc nhiên không ai gọi tôi về điều này! Dù sao, đó là vars()locals() giống nhau.

Các vấn đề liên quan