2016-07-13 3 views
-3

Я не понимаю, как я получаю эту ошибку, может кто-то поможет:Ошибка ул»объект не вызываемая

import time 
import os 
import xlwt 
from datetime import datetime 
num = 0 

def default(): 
    global num 
    global model 
    global partnum 
    global serialnum 
    global countryorigin 

    time.sleep(1) 
    print ("Model: ") 
    model = input() 
    print() 
    print ("Part number: ") 
    partnum = input() 
    print() 
    print ("Serial Number: ") 
    serialnum = input() 
    print() 
    print ("Country of origin: ") 
    countryorigin = input() 
    print ("Thanks") 
    num = num+1 
    xlwt() 

def xlwt(): 
    print ("Do you want to write to excel?") 
    excel = input() 
    if excel == "y" or "yes": 
     excel() 
    else: 
     print ("Bye") 
     sys.exit() 

def excel(): 
    print ("Enter a spreadsheet name") 
    name = input() 
    wb = xlwt.Workbook() 
    ws = wb.add_sheet(name) 

    ws.write(0,0,"Model") 
    ws.write(0,1,"Part Number") 
    ws.write(0,2,"Serial Number") 
    ws.write(0,3,"Country Of Origin") 

    ws.write(num,0,model) 
    ws.write(num,1,partnum) 
    ws.write(num,2,serialnum) 
    ws.write(num,3,countryorigin) 

    ws.save(name) 

def custom(): 
    print() 

def main(): 
    print ("Welcome") 
    print() 
    print ("The deafult catagories are: Model, Part Number, Serial Number," 
      "country of origin") 
    time.sleep(1) 
    print() 
    dorc() 

def dorc():  
    print ("Would you like to use the default or custom?") 
    dorc = input() 
    if dorc == "default": 
     default() 
    elif dorc == "custom": 
     custom() 
    else: 
     print ("Invalid input") 
     dorc() 

main() 

Когда я выполняю это, я получаю сообщение об ошибке str object is not callable.

+2

'excel = input()', затем 'excel()'. Смешивание имен функций с * переменными * –

ответ

1

У вас есть одновременно функция имени excel() и локальная переменная имени excel, который вы назначили строку.

Вы не можете этого сделать и ожидать, что функция по-прежнему будет доступна. Локальное имя excel маскирует глобальное, поэтому excel() пытается вызвать результат строки, возвращаемый input().

Переименовать переменный:

print ("Do you want to write to excel?") 
choice = input() 
if choice in ("y", "yes"): 
    excel() 

Обратите внимание, что я также исправленное ваш переменный тест; excel == "y" or "yes" не делает то, что, по вашему мнению, делает, логика языка программирования не совсем такая же, как английские грамматические правила. См Why does `a == b or c or d` always evaluate to True?

Далее, вы делаете ту же ошибку, используя имя xlwt как для модуля импортируемых и функции:

import xlwt 

# ... 

def xlwt(): 
    # ... 

Оба модуля и функции являются глобальными именами, а имя может только укажите либо импортированный модуль, либо созданную вами функцию, но не одновременно. Переименуйте функцию к чему-то еще, в противном случае следующая строка не получится слишком:

wb = xlwt.Workbook() 

потому что xlwt связан с вашей функции, как было определено позже, чем импорта модуля.

+0

Я исправил, что теперь спасибо: что это за ошибка ", строка 43, в excel wb = xlwt.Workbook() AttributeError: объект 'function' не имеет атрибута 'Workbook' –

+0

@LeoRogers : каждое имя в программе Python живет в одном и том же пространстве имен. 'xlwt' не может быть как модулем, который вы импортировали, так и созданной вами функцией. Переименуйте свою функцию. –

Смежные вопросы