2013-10-21 62 views
0

嘗試將下列內容轉換爲def,但是做一些可能不被允許的事情......我做錯了什麼,怎麼能做得更好?python def(AttributeError:'str'object has no attribute'read')

# Same for both 
import alsaaudio 
l_input = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NONBLOCK, card='default') 
r_input = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NONBLOCK, card='default') 
# 

l, data = l_input.read() 
if l > 0: 
    # transform data to logarithmic scale 
    lin_vu = (math.log(float(max(audioop.max(data, 2),1)))-log_lo)/(log_hi-log_lo) 
    # Calculate value 
    lin_vu = (min(max(int(lin_vu*15),0),15)) 
l, data = r_input.read() 
if l > 0: 
    # transform data to logarithmic scale 
    rin_vu = (math.log(float(max(audioop.max(data, 2),1)))-log_lo)/(log_hi-log_lo) 
    # Calculate value 
    rin_vu = (min(max(int(rin_vu*15),0),15)) 

我希望當我需要讀4個值,而不僅僅是兩家上市做這樣的事情:

def readvu(src): 
    l, data = src.read() 
    if l > 0: 
    # transform data to logarithmic scale 
    l_vu = (math.log(float(max(audioop.max(data, 2),1)))-log_lo)/(log_hi-log_lo) 
    # Calculate value 
    l_vu = (min(max(int(l_vu*15),0),15)) 

lin_vu = readvu('l_input'); 
rin_vu = readvu('r_input'); 

但是,這產生了提到的錯誤...

+0

請提供堆棧跟蹤也.. – mshsayem

+1

也很明顯。您將'readvu'的參數作爲字符串調用'readvu('l_input')'。後來,在'readvu'裏面,你試圖對一個字符串('src'現在是一個字符串)調用'read'! – mshsayem

回答

1

的解決方案是顯而易見的:如果您撥打readvu('l_input'),您的src變爲'l_input'.read()從它將失敗。

調用應該像

lin_vu = readvu(l_input) 
rin_vu = readvu(r_input) 

其中通過實際的變量,而不是字符串。

+1

有時候,答案太簡單了,不能自己注意...... :)謝謝 – dmgeurts

0

思想的變化給我帶來了以下內容:

# Convert log scale, calculate value & max 
def vu_log(data,vu_max,max_t): 
    # transform data to logarithmic scale 
    vu = (math.log(float(max(audioop.max(data, 2),1)))-log_lo)/(log_hi-log_lo) 
    # Calculate value 
    vu = (min(max(int(vu*15),0),15)) 
    if vu >= vu_max: 
    max_t = (3 * vu_fps) # keep max for 3 seconds 
    vu_max = vu 
    else: 
    max_t = max(0, max_t-1) # Reduce max timer by 1 until 0 
    return (vu,vu_max,max_t); 

# Fetch Left input VU from ALSA 
l, data = l_input.read() 
if l > 0: 
    # Transform data to logarithmic scale and calculate value 
    lin = vu_log(data,lin_max,lin_t) 
    lin_vu = lin[0] # Desired value 
    lin_max = lin[1] # Maximum value (last 3 sec) 
    lin_t = lin[2] # Used for tracking age of lin_max 

建設性的建議,隨時歡迎... :)

+1

'lin_vu,lin_max,lin_t = vu_log(...)'更短。 – glglgl

+1

和'return vu,vu_max,max_t'更多括號和分號 – glglgl

+0

謝謝,不知道。 – dmgeurts

相關問題