首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python后端面试:面向员工的任务管理系统

Python后端面试:面向员工的任务管理系统
EN

Code Review用户
提问于 2016-03-14 19:58:14
回答 1查看 2.5K关注 0票数 19

我最近申请了一个后端职位,并被要求完成一个带回家面试的问题。我认为这个问题相当简单,我在大约一个小时内就完成了,尽管有人告诉我,这可能需要4个小时。

我最近得到了回复,说我的回答没有显示出所需的技能水平。回头看我的答案,我不太清楚我应该在哪里改进。

请看一看,看看你会怎么做。

最初的问题:

描述:一个主管正在使用TaskManagementSystem来管理他的员工的任务。该系统可以添加用户,将任务分配给用户,并获得属于特定用户的任务(S)。限制:您不能修改usertask类。self.usersself.tasksTaskManagementSystem中必须保持为列表。您可以引入新的方法和类变量。目标:

  1. 修复阻止程序正确运行的语法和语义错误。
  2. get_user_tasks()更改为返回任务名称列表,而不是任务对象。
  3. add_user()add_task()get_user_tasks()方法中添加错误处理
  4. 优化TaskManagementSystem以处理大量用户和任务

面试时提供的代码:

#!/usr/bin/envpython2.7#编码: utf-8类用户(对象):def __init__(self,user_id,name):‘任务对象。无法修改此代码。@ user_id: int @ name: string‘’self.user_id = user_id self.name = name class task( object ):def __init__(self,user_id,task_name):‘’任务对象。无法修改此代码。@ user_id: int @ task_name: string‘’self.user_id = user_id self.task_name = task_name class TaskManagementSystem(object):def __init__(self):self.users = [] #存储用户对象的列表self.tasks = [] #存储任务对象的列表user_name):“”添加一个新的用户@ user_name: string条件:每个用户都应该有一个惟一的名称,每个用户都应该在self.users: if user.user_id > unique_id: unique_中为用户设置一个唯一的id‘’unique_id =0。id = user.id self.users.append(用户(unique_id,(User_name) add_task(self,user_name,task_name):“”为用户添加任务@ user_name: string @ task_name: string条件:用户在self.users: if user.name = user_name: user_id = user中不应该有两个或多个具有相同名称‘’的任务。user_id self.users.append(任务(user_id,(Task_name) get_user_tasks(self,user_name):‘’获取任务(S),该任务属于指定用户名@ user_name: string‘’user_tasks = [],用于self.users: if user.name == user_name: for task in self.tasks: if task.user_id == user。user_id: user_tasks.append(任务)返回user_tasks如果__name__ == "__main__":tms = TaskManagementSystem() tms.add_user('Bob') tms.add_task('Bob‘)tms.add_task('Bob',‘杂货店’) tms.add_task('Bob',‘日托’)打印tms.get_user_tasks('Bob') #应该打印:洗衣,杂货店,日托

下面是我提交的作为我的答案的代码:

代码语言:javascript
复制
#!/usr/bin/env python2.7
# encoding: utf-8
from random import choice


class user(object):

    def __init__(self, user_id, name):
        '''
        Task object.  This code can not be modified.
            @ user_id: int
            @ name: string
        '''
        self.user_id = user_id
        self.name = name


class task(object):

    def __init__(self, user_id, task_name):
        '''
        Task object.  This code can not be modified.
            @ user_id: int
            @ task_name: string
        '''
        self.user_id = user_id
        self.task_name = task_name


class TaskManagementSystem(object):

    def __init__(self):
        self.users = []  # stores a list of user objects
        self.tasks = []  # stores a list of task objects

    def add_user(self, user_name):
        '''
        Add a new user
            @ user_name: string

        Condition:
            Every user should have a unique name
            Every user should have a unique id
        '''

        # Create a unique id based on current user list.
        if self.users:
            unique_id = max([_user.user_id for _user in self.users]) + 1

        # There are no current users.
        else:
            unique_id = 1

        # Check that user_name is not taken.
        if [_user for _user in self.users if _user.name == user_name]:
            print 'That user name is taken.'
        else:
            self.users.append(user(unique_id, user_name))


    def add_task(self, user_name, task_name):
        '''
        Add a task for a user
            @ user_name: string
            @ task_name: string

        Condition:
            The user should not have two or more tasks with the same name
        '''

        user_id = self.get_user_id(user_name)
        if not user_id:
            return

        if task_name in self.get_user_tasks(user_name):
            print 'The user has already been asigned this task.'

        else:
            self.tasks.append(task(user_id, task_name))


    def get_user_id(self, user_name):
        '''
        Get a users id.
        Prints error if not found.
            @ user_name: string
        '''

        try:
            return [_user.user_id for _user in self.users
                    if _user.name == user_name][0]
        except(IndexError):
            print 'User not found.'


    def get_user_tasks(self, user_name):
        '''
        Get task(s) that belongs to the specified user name
            @ user_name: string
        '''

        user_id = self.get_user_id(user_name)

        if not user_id:
            return

        return [_task.task_name for _task in self.tasks
                if _task.user_id == user_id]


def test_add_users(n):
    '''
    Test by adding n users.
        @ n: int
    '''

    print 'adding users...'
    for x in xrange(n):
        user_name = ''.join([chr(choice(range(97, 123))) for c in range(4)])
        tms.add_user(user_name)

    n_added = len(tms.users)
    print '{} users added. {} user names rejected.'.format(n_added, n - n_added)

def test_add_tasks(n):
    '''
    Test by assigning random users tasks.
        @ n: int
    '''

    print 'adding tasks...'
    for x in xrange(n):
        user_name = choice(tms.users).name      # Grabs a random user's name
        task_name = ''.join([chr(choice(range(97, 123))) for c in range(4)])
        tms.add_task(user_name, task_name)

    n_added = len(tms.tasks)
    print '{} tasks added. {} task rejected.'.format(n_added, n - n_added)


if __name__ == "__main__":
    tms = TaskManagementSystem()

    # Test with lots of users.
    # test_add_users(10000)
    # test_add_tasks(10000)

    tms.add_user('Bob')
    tms.add_task('Bob', 'laundry')
    tms.add_task('Bob', 'grocery')
    tms.add_task('Bob', 'daycare')

    print tms.get_user_tasks('Bob')
    # should print: ['laundry', 'grocery', 'daycare']
EN

回答 1

Code Review用户

回答已采纳

发布于 2016-03-14 21:00:43

让我们依次处理这四点:

  • 语法和语义错误。我想这就是缩进问题,你似乎正确地解决了这个问题。
  • 更改get_user_tasks()以返回列表。这挺不错的。但是,如果找不到用户,则返回None --这不是一个列表,可能被解释为用户存在,并且没有分配任何任务,这是错误的。您应该抛出一个UserNotFound异常(参见下面)。这是对列表理解的一个很好的使用,但是如果你有很多任务的话,你会很慢(同样,见下文)。
  • 添加错误处理。您的错误处理方法是错误的--而不是将消息打印到stdout (这对于调用程序是非常困难的,即。try … except),您应该抛出适当的异常。例如:如果我试图添加一个已经存在的用户,您的add_user方法可能会引发DuplicateUser异常。这对于控制流更有用。您的错误信息可能更具体--虽然很明显,我试图重新添加哪个用户--添加了一个小脚本,它显示在一个大量的日志文件中,但是如果知道哪个用户被添加了两次,那就太好了。这对调试很有用。
  • 为大量的任务和用户优化类。这似乎是关键的任务,似乎你没有在这方面做任何事情。我本可以将这两个属性交换为更合适的数据结构(可能是dicts),但这显然违反了规则。您可以拥有包含正确数据结构的受保护属性_users_tasks,并添加返回正确列表的属性userstasks。这样就保留了公共接口,但是您的实现效率更高。为此,您需要使用@property@foo.setter装饰器--并不是完全微不足道,但也不是不可能的。

我不是这个面试小组的成员,但关键的错误似乎是错误处理(使用异常,而不是打印)和缺乏有意义的更改来提高可伸缩性。

还有其他一些我发现的小事情:

  • 阅读PEP 8风格指南。usertask类的名称应该是CamelCase
  • user对象的docstring不正确。这是你故意犯的错误吗?
  • add_user()方法根据现有的用户ID分配用户ID。如果稍后添加一个delete_user()方法(例如:创建用户'alice‘(id 1)创建用户'bob’(id 2)删除用户'bob‘(id 2)在不同的时间点创建用户'carol’(id 2),我有两个ID相同的用户,这可能会导致混淆。如果It是相当独特的,那就太好了。也许用hash(name)
  • 这并没有错,但有点不寻常:除了(IndexError):except是一个语句,而不是一个函数。
  • 我知道您不允许修改usertask对象,所以这是次要的:这两个对象可以被名元组替换,具有多个优点:
    • 减少占用
    • “S”
    • 相等/比较语义
票数 15
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/122849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档