2016-09-19 37 views
5

Sau các bài viết khác ở đây, tôi có một chức năng in ra thông tin về một biến dựa trên tên của nó. Tôi muốn chuyển nó thành một mô-đun.Acessing một biến như một chuỗi trong một mô-đun

#python 2.7 
import numpy as np 
def oshape(name): 
    #output the name, type and shape/length of the input variable(s) 
    #for array or list 
    x=globals()[name] 
    if type(x) is np.array or type(x) is np.ndarray: 
     print('{:20} {:25} {}'.format(name, repr(type(x)), x.shape)) 
    elif type(x) is list: 
     print('{:20} {:25} {}'.format(name, repr(type(x)), len(x))) 
    else: 
     print('{:20} {:25} X'.format(name, type(t))) 

a=np.array([1,2,3]) 
b=[4,5,6] 
oshape('a') 
oshape('b') 

Output:

a     <type 'numpy.ndarray'> (3,) 
b     <type 'list'>    3 

Tôi muốn đặt chức năng oshape này() vào một module để nó có thể được tái sử dụng. Tuy nhiên, việc đặt trong một mô-đun không cho phép truy cập vào các hình cầu từ mô-đun chính. Tôi đã thử những thứ như 'import __main__' và thậm chí lưu trữ các hàm globals() và chuyển nó vào submodule. Vấn đề là globals() là một hàm, trả về cụ thể các globals của module mà nó được gọi từ, không phải là một hàm khác cho mỗi module.

import numpy as np 
import olib 

a=np.array([1,2,3]) 
b=[4,5,6] 

olib.oshape('a') 
olib.oshape('b') 

Cung cấp cho tôi:

KeyError: 'a' 

Thông tin thêm: Mục đích là để giảm gõ dư thừa. Với một sửa đổi nhỏ (tôi lấy nó ra để làm cho nó đơn giản cho câu hỏi), oshape có thể báo cáo về một danh sách các biến, vì vậy tôi có thể sử dụng nó như:

oshape('a', 'b', 'other_variables_i_care_about') 

Vì vậy, giải pháp đòi hỏi phải gõ tên biến trong hai lần không thực sự là những gì tôi đang tìm kiếm. Ngoài ra, chỉ cần chuyển vào biến không cho phép tên được in. Hãy suy nghĩ về việc sử dụng điều này trong một tệp nhật ký dài để hiển thị kết quả tính toán & kiểm tra kích thước biến.

+1

tại sao không chỉ vượt qua trong các mảng? –

+0

tại sao không vượt qua biến trực tiếp và sử dụng nó như là? – njzk2

+0

Vì tôi muốn in tên của biến. Tôi đã làm những việc như in ('a', nhập (a), a.shape) nhưng điều đó thật tẻ nhạt. – SolverWorld

Trả lời

1

Logic của bạn là cách phức tạp, bạn chỉ cần vượt qua các mảng vì bạn cũng đã chuyển tên biến như một chuỗi để bạn không tìm kiếm thứ gì đó mà bạn không có quyền truy cập. Nhưng nếu bạn muốn làm cho công việc mã của bạn chính xác như là bạn có thể thiết lập một attibute trên mô-đun:

import numpy as np 
import olib 

a = np.array([1, 2, 3]) 
b = [4, 5, 6] 
olib.a = a 
olib.b = b 
olib.oshape('a') 
olib.oshape('b') 

này sẽ mất bất kỳ args và tìm kiếm các mô-đun mã được chạy từ cho attrs:

import numpy as np 
import sys 
from os.path import basename 
import imp 

def oshape(*args): 
    # output the name, type and shape/length of the input variable(s) 
    # for array or list 
    file_name = sys.argv[0] 
    mod = basename(file_name).split(".")[0] 
    if mod not in sys.modules: 
     mod = imp.load_source(mod, file_name) 
     for name in args: 
      x = getattr(mod, name) 
      if type(x) is np.array or type(x) is np.ndarray: 
       print('{:20} {:25} {}'.format(name, repr(type(x)), x.shape)) 
      elif type(x) is list: 
       print('{:20} {:25} {}'.format(name, repr(type(x)), len(x))) 
      else: 
       print('{} {} X'.format(name, type(x))) 

chỉ cần vượt qua chuỗi tên biến:

:~/$ cat t2.py 
import numpy as np 
from olib import oshape 

a = np.array([1, 2, 3]) 
b = [4, 5, 6] 
c = "a str" 

oshape("a", "b", "c") 


:$ python t2.py 
a     <type 'numpy.ndarray'> (3,) 
b     <type 'list'>    3 
c <type 'str'> X 
+0

Đây là mã dự phòng cho mỗi biến tôi muốn in ra. Suy nghĩ thú vị, mặc dù. Tôi có thể làm olib.globals = globals() một lần và truy cập từ mô-đun, nhưng tôi không thể tạo bất kỳ biến mới nào sau cuộc gọi đó nếu muốn xem chúng. – SolverWorld

+0

Có nhiều cách để tự động hóa quá trình nếu bạn chạy nó thông qua một hàm hoặc được bọc olib để tránh gõ nó ra cho mỗi quá trình. –

+0

Điều đó thật tuyệt vời, bạn có thể đưa ra một ví dụ đơn giản không? Nếu nó yêu cầu mã được thêm vào chính, nó sẽ đánh bại mục đích của việc sử dụng một mô-đun và tôi cũng có thể chỉ sử dụng mã tôi đăng trong câu hỏi ban đầu. – SolverWorld

2

Vấn đề thực tế bạn gặp phải ở đây là vấn đề về không gian tên.

Bạn có thể viết phương pháp của bạn theo cách này:

def oshape(name, x): 
    # output the name, type and shape/length of the input variable(s) 
    # for array or list 
    if type(x) in (np.array, np.ndarray): 
     print('{:20} {:25} {}'.format(name, repr(type(x)), x.shape)) 
    elif type(x) is list: 
     print('{:20} {:25} {}'.format(name, repr(type(x)), len(x))) 
    else: 
     print('{:20} {:25} X'.format(name, type(x))) 

và sử dụng nó như thế này:

import numpy as np 
import olib 

a=np.array([1,2,3]) 
b=[4,5,6] 

olib.oshape('a', a) 
olib.oshape('b', b) 

nhưng nó trông rất dư thừa có biến và tên của nó trong các đối số.

Một giải pháp khác là cung cấp mã số globals() cho phương pháp và giữ mã của bạn.

Hãy xem this answer về khả năng hiển thị của các biến toàn cầu thông qua các mô-đun.

+0

Như bạn nói, giải pháp đầu tiên là gõ thừa. Và tôi muốn có thể nói những thứ như oshape ('a', 'b', 'other_vars_i_care_about') với một chút sửa đổi. Giải pháp thứ hai của bạn có cùng một vấn đề - gõ thừa để vượt qua globals() trong mỗi cuộc gọi. Đây là nơi các macro kiểu C tiện dụng. – SolverWorld

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