Nói rằng tôi có một biến có tên
filename
no_sig_resonance.dat
mass_peak
700
choice
1,2,3
2 Nó bằng 2. Làm thế nào tôi có thể truy cập tên của biến? Một cái gì đó tương đương vớiIn [53]: namestr[choice]
Out[53]: 'choice'
để sử dụng trong việc tạo ra một từ điển. Có một cách tốt để làm điều này và tôi chỉ thiếu nó.
EDIT:
Lý do để làm điều này là như vậy. Tôi đang chạy một số công cụ phân tích dữ liệu nơi tôi gọi chương trình với nhiều tham số mà tôi muốn điều chỉnh, hoặc không điều chỉnh, trong thời gian chạy. Tôi đã đọc trong các tham số tôi đã sử dụng trong lần chạy cuối cùng từ tệp .config được thành lập dưới dạng
filename
no_sig_resonance.dat
mass_peak
700
choice
1,2,3
Khi được nhắc cho các giá trị, được sử dụng trước đó được hiển thị và đầu vào chuỗi trống sẽ sử dụng giá trị được sử dụng trước đó.
Câu hỏi của tôi xuất hiện bởi vì khi viết từ điển mà các giá trị này đã được quét vào. Nếu cần tham số, tôi sẽ chạy
filename
no_sig_resonance.dat
mass_peak
700
choice
1,2,3
3 truy cập vào tệp và tìm tham số.Tôi nghĩ rằng tôi sẽ tránh được vấn đề cùng nhau bằng cách đọc tệp .________ 14 một lần và tạo ra một từ điển từ đó. Tôi tránh điều đó ban đầu vì ... những lý do tôi không còn nhớ nữa. Tình huống hoàn hảo để cập nhật mã của tôi!
Constantin
Phim thương hiệu vàng 27K1059 Huy hiệu bạc79 Hàng đồng10 gold badges59 silver badges79 bronze badges
hỏi ngày 26 tháng 2 năm 2009 lúc 22:26Feb 26, 2009 at 22:26
Vật lýMichaelPhysmichaelphysicsmichael
4.61311 Huy hiệu vàng34 Huy hiệu bạc54 Huy hiệu đồng11 gold badges34 silver badges54 bronze badges
9
Nếu bạn nhấn mạnh, đây là một số giải pháp dựa trên kiểm tra khủng khiếp.
import inspect, re
def varname[p]:
for line in inspect.getframeinfo[inspect.currentframe[].f_back][3]:
m = re.search[r'\bvarname\s*\[\s*[[A-Za-z_][A-Za-z0-9_]*]\s*\]', line]
if m:
return m.group[1]
if __name__ == '__main__':
spam = 42
print varname[spam]
Tôi hy vọng nó sẽ truyền cảm hứng cho bạn để đánh giá lại vấn đề bạn có và tìm kiếm một cách tiếp cận khác.
Đã trả lời ngày 26 tháng 2 năm 2009 lúc 23:05Feb 26, 2009 at 23:05
5
Để trả lời câu hỏi ban đầu của bạn:
def namestr[obj, namespace]:
return [name for name in namespace if namespace[name] is obj]
Example:
>>> a = 'some var'
>>> namestr[a, globals[]]
['a']
Như @rbright đã chỉ ra bất cứ điều gì bạn làm có lẽ có những cách tốt hơn để làm điều đó.
Đã trả lời ngày 26 tháng 2 năm 2009 lúc 23:14Feb 26, 2009 at 23:14
JFSJFSjfs
383K182 Huy hiệu vàng947 Huy hiệu bạc1618 Huy hiệu đồng182 gold badges947 silver badges1618 bronze badges
9
Nếu bạn đang cố gắng làm điều này, điều đó có nghĩa là bạn đang làm điều gì đó sai. Thay vào đó, hãy xem xét sử dụng
filename
no_sig_resonance.dat
mass_peak
700
choice
1,2,3
5.def show_val[vals, name]:
print "Name:", name, "val:", vals[name]
vals = {'a': 1, 'b': 2}
show_val[vals, 'b']
Output:
Name: b val: 2
Đã trả lời ngày 26 tháng 2 năm 2009 lúc 22:52Feb 26, 2009 at 22:52
đệ quyrecursive
82K32 Huy hiệu vàng147 Huy hiệu bạc236 Huy hiệu Đồng32 gold badges147 silver badges236 bronze badges
3
Bạn không thể, vì không có biến trong Python mà chỉ tên.
Ví dụ:
> a = [1,2,3]
> b = a
> a is b
True
Cái nào trong số đó bây giờ là biến chính xác? Không có sự khác biệt giữa
filename
no_sig_resonance.dat
mass_peak
700
choice
1,2,3
6 và filename
no_sig_resonance.dat
mass_peak
700
choice
1,2,3
7.Có một câu hỏi tương tự trước đây.
Đã trả lời ngày 26 tháng 2 năm 2009 lúc 22:31Feb 26, 2009 at 22:31
Georg Schöllygeorg SchöllyGeorg Schölly
Huy hiệu vàng 122K4848 gold badges214 silver badges264 bronze badges
7
Thay vì hỏi chi tiết về một giải pháp cụ thể, tôi khuyên bạn nên mô tả vấn đề bạn gặp phải; Tôi nghĩ rằng bạn sẽ nhận được câu trả lời tốt hơn. Tôi nói điều này vì gần như chắc chắn có một cách tốt hơn để làm bất cứ điều gì bạn đang cố gắng làm. Truy cập tên biến theo cách này là không cần thiết để giải quyết các vấn đề trong bất kỳ ngôn ngữ nào.
Điều đó nói rằng, tất cả các tên biến của bạn đã có trong các từ điển có thể truy cập thông qua các chức năng tích hợp của người dân địa phương và toàn cầu. Sử dụng chính xác cho phạm vi bạn đang kiểm tra.
Một trong số ít các thành ngữ phổ biến để kiểm tra các từ điển này là để nội suy chuỗi dễ dàng:
>>> first = 'John'
>>> last = 'Doe'
>>> print '%[first]s %[last]s' % globals[]
John Doe
Loại điều này có xu hướng dễ đọc hơn một chút so với các lựa chọn thay thế mặc dù nó yêu cầu kiểm tra các biến theo tên.
Đã trả lời ngày 26 tháng 2 năm 2009 lúc 22:49Feb 26, 2009 at 22:49
Ryan Brightryan BrightRyan Bright
3,45721 Huy hiệu bạc19 Huy hiệu đồng21 silver badges19 bronze badges
2
Với sự đánh giá háo hức, các biến về cơ bản biến thành giá trị của chúng bất cứ khi nào bạn nhìn vào chúng [để diễn giải]. Điều đó nói rằng, Python có không gian tên tích hợp. Ví dụ: locals [] sẽ trả về bản đồ từ điển của một tên của các biến của hàm cho các giá trị của chúng và Globals [] thực hiện tương tự cho một mô -đun. Do đó:
for name, value in globals[].items[]:
if value is unknown_variable:
... do something with name
Lưu ý rằng bạn không cần nhập bất cứ thứ gì để có thể truy cập người dân địa phương [] và Globals [].
Ngoài ra, nếu có nhiều bí danh cho một giá trị, việc lặp lại thông qua một không gian tên chỉ tìm thấy cái đầu tiên.
Đã trả lời ngày 26 tháng 2 năm 2009 lúc 22:45Feb 26, 2009 at 22:45
NikhilnikhilNikhil
5.6451 Huy hiệu vàng31 Huy hiệu bạc 30 Huy hiệu Đồng1 gold badge31 silver badges30 bronze badges
2
Một cái gì đó như thế này sẽ làm việc cho bạn?
filename
no_sig_resonance.dat
mass_peak
700
choice
1,2,3
0Và trong ví dụ của bạn:
filename
no_sig_resonance.dat
mass_peak
700
choice
1,2,3
1Đã trả lời ngày 26 tháng 2 năm 2009 lúc 23:01Feb 26, 2009 at 23:01
myroslavmyroslavmyroslav
3.64322 Huy hiệu bạc28 Huy hiệu đồng22 silver badges28 bronze badges
Đối với câu hỏi sửa đổi về cách đọc trong các tham số cấu hình, tôi thực sự khuyên bạn nên tiết kiệm cho mình một chút thời gian và công sức và sử dụng ConfigParser hoặc [công cụ ưa thích của tôi] configObj.
Họ có thể làm mọi thứ bạn cần, chúng dễ sử dụng và người khác đã lo lắng về cách làm cho họ hoạt động bình thường!
Đã trả lời ngày 26 tháng 2 năm 2009 lúc 23:39Feb 26, 2009 at 23:39
James Bradyjames BradyJames Brady
26.3K7 Huy hiệu vàng 50 Huy hiệu bạc57 Huy hiệu Đồng7 gold badges50 silver badges57 bronze badges