Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 4, 2010 14:36:15

Юля
От:
Зарегистрирован: 2010-11-04
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите разобраться и найти ошибку

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

Тема: учет внутриофисных расходов
Есть Отделы(Название, сотрудники, подотделы)
Сотрудники (Ф.И.О)
Виды расходов (наименование)
Расходы (Сумма, вид расходов, Сотрудник)

1 файл rashoddir.py

# -*- coding: utf-8 -*-

"""
Учет внутриофисных расходов
"""
import itertools

class Collaborator:
"""
Сотрудник
"""
def __init__(self, code, family, name, patronym):
self.code = code
self.family = family
self.name = name
self.patronym = patronym

def __str__(self):
return "%s %.2s. %.2s." % (self.family, self.name, self.patronym)

def __hash__(self):
return hash(self.code)

def __eq__(self, other):
return self.code == other.code

class Otdel:
"""
Отдел
"""
def __init__(self, name):
self.name = name
self.collaborators = set()
self.otdels = set()

def __hash__(self):
return hash(self.name)

def __eq__(self, other):
return self.name == other.name

def __iter__(self):
i = iter(self.collaborators)
for s in self.otdels:
i = itertools.chain(i, iter(s))
return i

def add(self, collaborator):
assert collaborator not in self
self.collaborators.add(collaborator)

def addOtdel(self, otdel):
assert otdel not in self.otdels
assert not set(self).intersection(set(otdel))
self.otdels.add(otdel)

def iterOtdel(self):
i = iter(self.otdels)
for s in self.otdels:
i = itertools.chain(i, s.iterOtdel())
return i

class RashodType:
"""
Вид расходов
"""
def __init__(self, name):
self.name = name

def __hash__(self):
return hash(self.name)

def __eq__(self, other):
return self.name == other.name

class RashodTypes(set):
"""
Виды расходов
"""
def add(self, rashodType):
assert rashodType not in self
set.add(self, rashodType)

class Rashod:
"""
Расход
"""
def __init__(self, rashod, rashodType):
self.sum = rashod
self.type = rashodType

def __hash__(self):
return hash(self.sum)

def __eq__(self, other):
return self.sum == other.sum

class Rashods(set):
"""
Расходы
"""
def __init__(self, rashodTypes):
set.__init__(self)
self.rashodTypes = rashodTypes

def add(self, rashod):
assert rashod.type in self.rashodTypes
set.add(self, rashod)

class RashodRecord:
"""
Запись в учете внутриофисных расходов
"""
def __init__(self, rashod, collaborator):
self.rashod = rashod
self.collaborator = collaborator

def __hash__(self):
return hash((self.rashod, self.collaborator))

def __eq__(self, other):
return self.rashod == other.rashod and \
self.collaborator == other.collaborator

class RashodDir(set):
"""
Расходный справочник
"""
def __init__(self, rashods, otdel):
set.__init__(self)
self.rashods = rashods
self.otdel = otdel

def add(self, rashodRecord):
assert rashodRecord.collaborator in self.otdel
assert rashodRecord not in self
set.add(self, rashodRecord)

if __name__ == '__main__':
import zzcsv

rashodDir = zzcsv.load()

for s in rashodDir.otdel.iterOtdel():
if s.name == 'отдел кадров':
for r in rashodDir:
if r.collaborator in s and r.collaborator.name.find('ан') >= 0:
print r.rashod.sum, "%s %s. %s."% \
(r.collaborator.family, r.collaborator.name[:2], r.collaborator.patronym[:2])
break

for s in rashodDir.otdel.iterOtdel():
if s.name == 'руководство':
for r in rashodDir:
if r.collaborator in s and r.collaborator.family.find('ск') >= 0:
print r.rashod.sum, "%s %s. %s."% \
(r.collaborator.family, r.collaborator.name[:2], r.collaborator.patronym[:2])
break
2 файл zzcsv.py
# -*- coding: utf-8 -*-

import os, csv

import rashoddir

def save(rashodDir):
def write(otdel):
for s in otdel.otdels:
writer.writerow((s.name, otdel.name))
write(s)

writer = csv.writer(open(os.path.join(os.curdir, 'otdel.csv'), 'wb'), delimiter=';')
writer.writerow((rashodDir.otdel.name, None))
write(rashodDir.otdel)

def find(c, otdel):
if otdel.collaborators:
return otdel.name
else:
for s in otdel.otdels:
r = find(c, s)

if r:
return r

writer = csv.writer(open(os.path.join(os.curdir, 'mts.csv'), 'wb'), delimiter=';')
for r in rashodDir:
writer.writerow((r.rashod.sum, r.collaborator.code, r.collaborator.family, r.collaborator.name, r.collaborator.patronym, find(r.collaborator, rashodDir.otdel), r.rashod.type.name))

def load():
otdel = {}
for rec in csv.reader(open(os.path.join(os.curdir, 'otdel.csv'), 'rb'), delimiter=';'):
otdel[rec[0]] = rashoddir.Otdel(rec[0])
if rec[1]:
otdel[rec[1]].addOtdel(otdel[rec[0]])
else:
rashodDir = rashoddir.RashodDir(rashoddir.Rashods(rashoddir.RashodTypes()), otdel[rec[0]])

rashods, rashodTypes, collaborators = {}, {}, {}
for rec in csv.reader(open(os.path.join(os.curdir, 'mts.csv'), 'rb'), delimiter=';'):
if rec[6] not in rashodTypes:
rashodTypes[rec[6]] = rashoddir.RashodType(rec[6])
rashodDir.rashods.rashodTypes.add(rashodTypes[rec[6]])
if rec[0] not in rashods:
rashods[rec[0]] = rashoddir.Rashod(rec[0], rashodTypes[rec[6]])
rashodDir.rashods.add(rashods[rec[0]])
key = int(rec[1])
if key not in collaborators:
collaborators[key] = rashoddir.Collaborator(key, rec[2], rec[3], rec[4])
otdel[rec[5]].add(collaborators[key])
rashodDir.add(rashoddir.RashodRecord(rashods[rec[0]], collaborators[key]))

return rashodDir

if __name__ == '__main__':
rashodDir = load()

for s in rashodDir.otdel.iterOtdel():
if s.name == 'отдел кадров':
for r in rashodDir:
if r.collaborator in s and r.collaborator.name.find('ан') >= 0:
print r.rashod.sum, "%s %s. %s."% \
(r.collaborator.family, r.collaborator.name[:2], r.collaborator.patronym[:2])
break

for s in rashodDir.otdel.iterOtdel():
if s.name == 'руководство':
for r in rashodDir:
if r.collaborator in s and r.collaborator.family.find('ск') >= 0:
print r.rashod.sum, "%s %s. %s."% \
(r.collaborator.family, r.collaborator.name[:2], r.collaborator.patronym[:2])
break

save(rashodDir)
И 2 csv файла с данными:

otdel.csv
МТС;
руководство;МТС
пресс-секретарь;руководство
зам. директор;руководство
директор;руководство
сервис;МТС
уборщик;сервис
дворник;сервис
отдел кадров;МТС
начальник;отдел кадров
сотрудник;отдел кадров
mts.csv
100 руб;4;Глухова;Анна;Юрьевна;начальник;канцтовары
100 руб;7;Звонов;Виталий;Степанович;дворник;канцтовары
200 руб;5;Цветков;Иван;Викторович;сотрудник;связь
35 руб;6;Маринин;Игорь;Олегович;уборщик;хоз. нужды
500 руб;3;Лаптева;Иврина;Сергеевна;пресс-секретарь;канцтовары
2 000 руб;1;Иванов;Иван;Андреевич;директор;связь
5 000 руб;2;Петров;Максим;Павлович;зам. директорь;хоз. нужды



Офлайн

#2 Ноя. 4, 2010 15:34:53

Юля
От:
Зарегистрирован: 2010-11-04
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите разобраться и найти ошибку

Чуть переделала. Теперь ошибка вот в этом месте

if key not in collaborators:
collaborators[key] = rashoddir.Collaborator(key, rec[2], rec[3], rec[4])
otdel[rec[5]].add(collaborators[key])
rashodDir.add(rashoddir.RashodRecord(rashods[rec[0]], collaborators[key]))
В 3 строке. Подскажите, что именно нужно исправить. На мой взгляд, все должно работать и сотрудник должен добавляться в отдел.



Офлайн

#3 Ноя. 5, 2010 17:52:33

ofigetitelno
От:
Зарегистрирован: 2006-08-01
Сообщения: 136
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите разобраться и найти ошибку

:)
строку:
5 000 руб;2;Петров;Максим;Павлович;зам. директорь;хоз. нужды
исправьте на:
5 000 руб;2;Петров;Максим;Павлович;зам. директор;хоз. нужды



Офлайн

#4 Ноя. 6, 2010 16:20:57

Юля
От:
Зарегистрирован: 2010-11-04
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите разобраться и найти ошибку

ofigetitelno спасибо.
А как насчет остальных ошибок? Почему программа не срабатывает? Еще заметила что после одного запуска все должности меняются на пресс-секретарь, а иногда файл с данными полностью очищается….

Пожалуйста, подскажите, как сделать чтобы заработало нормально… своих мозгов не хватит…



Офлайн

#5 Ноя. 6, 2010 17:09:20

helm2004
От: Украина, Винница
Зарегистрирован: 2008-02-27
Сообщения: 630
Репутация: +  9  -
Профиль   Отправить e-mail  

помогите разобраться и найти ошибку

Юля, Вы скажете что я злой(я таким и являюсь), но не зайти ли Вам на ссылку?

Отредактировано (Ноя. 6, 2010 17:09:45)

Офлайн

#6 Ноя. 6, 2010 17:17:13

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

помогите разобраться и найти ошибку

helm2004
Мда :) а вдруг правда девушка :)

Офлайн

#7 Ноя. 6, 2010 17:26:48

Юля
От:
Зарегистрирован: 2010-11-04
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите разобраться и найти ошибку

helm2004, спасибо, было очень познавательно.

sypper-pit,
Сейчас лень садится за учебники, но завтра где-то в районе обеда я опять сяду за эту замечательную программу и буду делать пока не получится. А она у меня навряд ли получится. Так что опять буду доставать Вас глупыми вопросами.

И вообще есть пример, даже 2, они работают, а в моей программке тоже самое, только классы по-другому назвала и не работает… так обидно… =(



Офлайн

#8 Ноя. 6, 2010 17:36:51

Юля
От:
Зарегистрирован: 2010-11-04
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите разобраться и найти ошибку

sypper-pit, а что будет если я и правда девушка?

П.С. схожу с ума, по питону у меня экзамен, а допуск-эта программа, я про нее 20 из 24 часа думаю.



Офлайн

#9 Ноя. 6, 2010 17:37:24

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

помогите разобраться и найти ошибку

Юля
Прога самодельная или же чьё то стороннее ?

Офлайн

#10 Ноя. 6, 2010 17:53:00

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

помогите разобраться и найти ошибку

а что за учебное заведение такое где преподают питон ? тебе еще GUI надо нарисовать ?

Отредактировано (Ноя. 6, 2010 17:55:17)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version