2010-10-24 1 views
1

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

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

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

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

def AppendRecord(key, **dictvalues): 
     salesDept[key] = dict(dictvalues) 

и вызов для жестких закодированных значений ...

AppendRecord('Jill',Name='Jill', Acctype='Savings') 

Теперь, когда я пытаюсь принять всех значений вместе с ключом от пользователя, я не могу позвонить function.I'm просто новичок в Python, так простите пожалуйста меня за любые ошибки:

Отредактировано код:

#/USR/бен/питон

import os  #This module is imported so as to use clear function in the while-loop 
import DB      #Imports the data from database DB.py 

def AppendRecord(key, **dictvalues): 
     DB.Accounts[key] = dict(dictvalues) 

def OpenAccount():   #Opens a new a/c and appends to the database data-base. 

     while True: 

       os.system("clear")  #Clears the screen once the loop is re-invoked 

#Parameters taken from the user at Run-time so as to make entries in the database and append them 


       print '\n','Choose an Account Type' 

       print '\n','\n1)Savings Account','\n2)Current Account' 

       choice = input('Enter an optin: ') 

       if choice == 1: 

         name = raw_input('\nEnter a name: ') 
         depo = input('\nEnter amount(Rs.): ') 
         key = raw_input('\nEnter an alphanumeric-id: ') 
         acc= raw_input('\nEnter the Account-Type: ') 

         AppendRecord(key,Name=name,Initial_deposit=depo,Acctype=acc) 

EDIT 1: Ошибки я получаю.

File "/usr/lib/python2.5/shelve.py", line 124, in __setitem__ 
    self.dict[key] = f.getvalue() 
TypeError: 'int' object does not support item assignment 

EDIT 2:

Ниже приводится DB.py базы данных исходного файла кода.

#!/usr/bin/python 

import shelve     #Module:Shelve is imported to achieve persistence 

Victor = {'Name':'Victor Hughes','Acctype':'Savings'} 
Xavier = {'Name':'Xavier Bosco','Acctype':'Savings'} 
Louis = {'Name':'Louis Philip','Acctype':'Current'} 
Beverly = {'Name':'Beverly Dsilva','Acctype':'Current'} 

Accounts = shelve.open('shelfile.shl')   #Accounts = {} 

Accounts['Louis']= Louis 
Accounts['Beverly']= Beverly 
Accounts['Xavier']= Xavier 
Accounts['Victor']= Victor 

Accounts.close() 
+0

Что пошло не так? есть ли сообщения об ошибках? Кроме того, у вас есть опечатка (я думаю, вы получите ошибку в противном случае) в вашем жестком закодированном звонке. Вы должны указывать только аргумент «Сбережения», а не весь ключевой элемент. – aaronasterling

+0

aaronasterling - Я исправил опечатку. Спасибо. Я добавил сообщение об ошибке, пожалуйста, проверьте EDIT 1. – Pavitar

+0

Нам нужна трассировка или более подробная информация о «невозможности вызова функции», чтобы мы могли вам помочь. :) –

ответ

1

Ваша проблема заключается в том, что DB модуль закрывает полку, прежде чем писать в него. Избавьтесь от последней строки, и она будет работать нормально.

Вам также необходимо предоставить функцию, чтобы закрыть ее или сделать это вручную.

#!/usr/bin/python 

import shelve     #Module:Shelve is imported to achieve persistence 


Accounts = 0 

Victor = {'Name':'Victor Hughes','Acctype':'Savings'} #??? 
Xavier = {'Name':'Xavier Bosco','Acctype':'Savings'} 
Louis = {'Name':'Louis Philip','Acctype':'Current'} 
Beverly = {'Name':'Beverly Dsilva','Acctype':'Current'} 


def open_shelf(name='shelfile.shl'): 
    global Accounts 
    Accounts = shelve.open(name)   #Accounts = {} 
    # why are you adding this every time? is this just debugging code? 
    Accounts['Louis']= Louis 
    Accounts['Beverly']= Beverly 
    Accounts['Xavier']= Xavier 
    Accounts['Victor']= Victor 


def close_shelf(): 
    Accounts.close() 

Теперь Вам необходимо вызвать функцию DB.open_shelf(), прежде чем писать в него и функцию DB.close_shelf, когда вы закончите. Я бы рекомендовал называть их в начале и в конце вашей программы соответственно.

Вы заметите, что это действительно просто упаковка shelve и добавление почти нулевого значения. Я бы отказался от всего модуля DB и просто использовал shelve.

+0

Да, это всего лишь код отладки. + 1 Спасибо, что отлично работает с вашим ответом. Но когда я пытаюсь читать из «shelfile.shl», я не вижу добавленных значений. :(Я смущен – Pavitar