- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
__author__ = 'mayukhsarkar'
import collections
def search_student(database=None, ID=None):
flag = False
try:
if ID is None or ID == 0:
raise TypeError
for each in database:
if each.id == ID:
print 'Student Name: ', each.name
flag = True
except TypeError:
print 'Provide the arguments properly'
finally:
return flag
studentDatabase = collections.namedtuple("student", "id name roll_no phone email")
DATABASE = [studentDatabase(1, 'Mayukh Sarkar', 9, '555-2312', 'mayukh2012@hotmail,com'),
studentDatabase(2, 'Alisha Sengupta', 7, '555-1345', 'alisha@gmail.com')]
if not search_student(DATABASE, 1):
print "Data not found"
在这个片段中,我想要函数 search_student
中的可变参数选项,这样如果我传递 roll_no
、email
那么如果学生找到该 ID,然后只打印 roll & email 和姓名。但是如果我不传递任何参数,那么只会打印名称
最佳答案
使用 bool 值设置是否打印名册和邮件的标志:
def search_student(database=None, ID=None, roll=False, email=False):
if ID is None or ID == 0:
print 'Provide the arguments properly'
return False
for each in database:
if each.id == ID:
print 'Student Name: {}'.format(each.name)
if roll:
print 'Stutent Roll: {}'.format(each.roll_no)
if email:
print("Student email: {}".format(each.email))
break
else:
return "User does not exist in database"
studentDatabase = collections.namedtuple("student", "id name roll_no phone email")
DATABASE = [studentDatabase(1, 'Mayukh Sarkar', 9, '555-2312', 'mayukh2012@hotmail,com'),
studentDatabase(2, 'Alisha Sengupta', 7, '555-1345', 'alisha@gmail.com')]
输出:
In [9]: search_student(DATABASE, 1, email=True,roll=True)
Student Name: Mayukh Sarkar
Stutent Roll: 9
Student email: mayukh2012@hotmail,com
In [10]: search_student(DATABASE, 1,roll=True)
Student Name: Mayukh Sarkar
Stutent Roll: 9
In [11]: search_student(DATABASE, 1, email=True)
Student Name: Mayukh Sarkar
Student email: mayukh2012@hotmail,com
In [12]: search_student(DATABASE, 1)
Student Name: Mayukh Sarkar
In [13]: search_student(DATABASE, 5)
Out[13]: 'User does not exist in database'
我还会使用 id 作为键将用户存储在字典中:
def search_student(database=None, ID=None, roll=False, email=False):
if ID is None or ID == 0:
print 'Provide the arguments properly'
return False
get = database.get(ID)
if get is not None:
print 'Student Name: {}'.format(get.name)
if roll:
print 'Student Roll: {}'.format(get.roll_no)
if email:
print("Student email: {}".format(get.email))
else:
return "User does not exist in database"
然后传递一个字典作为数据库:
studentDatabase = collections.namedtuple("student", "id name roll_no phone email")
DATABASE = {1: studentDatabase(1, 'Mayukh Sarkar', 9, '555-2312', 'mayukh2012@hotmail,com'),
2: studentDatabase(2, 'Alisha Sengupta', 7, '555-1345', 'alisha@gmail.com')}
输出是一样的:
In [18]: search_student(DATABASE, 1, email=True,roll=True)Student Name: Mayukh Sarkar
Student Roll: 9
Student email: mayukh2012@hotmail,com
In [19]: search_student(DATABASE, 1,roll=True)
Student Name: Mayukh Sarkar
Student Roll: 9
In [20]: search_student(DATABASE, 1, email=True)
Student Name: Mayukh Sarkar
Student email: mayukh2012@hotmail,com
In [21]: search_student(DATABASE, 1)
Student Name: Mayukh Sarkar
In [22]: search_student(DATABASE, 5)
Out[22]: 'User does not exist in database'
您最好对所有逻辑使用字典,但 getattr 将与 **kwargs 一起使用:
import collections
def search_student(database=None, ID=None, **kwargs):
if ID is None or ID == 0:
print 'Provide the arguments properly'
return False
get = database.get(ID)
if get is not None:
print 'Student Name: {}'.format(get.name)
for k in kwargs:
print("Student {}: {}".format(k, getattr(get,k)))
else:
return "User does not exist in database"
studentDatabase = collections.namedtuple("student", "id name roll_no phone email")
DATABASE = {1: studentDatabase(1, 'Mayukh Sarkar', 9, '555-2312', 'mayukh2012@hotmail,com'),
2: studentDatabase(2, 'Alisha Sengupta', 7, '555-1345', 'alisha@gmail.com')}
search_student(DATABASE,1,roll_no=True,email=True)
我们需要在用户输入无效关键字/属性时捕获,有很多方法可以处理它,但一种简单的方法是捕获属性错误:
try:
print("Student {}: {}".format(k, getattr(get, k)))
except AttributeError:
print("Informative message or whatever is suitable")
或者使用 hasattr 并在它返回 False 时做任何你想做的事:
if get is not None:
print 'Student Name: {}'.format(get.name)
for k in kwargs:
if not hasattr(get,k):
continue
print("Student {}: {}".format(k, getattr(get, k)))
或者传递一个默认值给getattr:
if get is not None:
print 'Student Name: {}'.format(get.name)
for k in kwargs:
val = getattr(get, k,False)
if val:
print("Student {}: {}".format(k, val))
else:....
关于python - 如何在函数中传递 namedtuple 的可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31089612/
typing module documentation表示下面的两个代码片段是等价的。 from typing import NamedTuple class Employee(NamedTuple)
是否可以在另一个 namedtuple 中包含一个 namedtuple? 例如: from collections import namedtuple Position = namedtuple('
为什么我不能 pickle typing.NamedTuple 而我可以 pickle collections.namedtuple?我如何设法 pickle NamedTuple? 这段代码展示了我
我正在尝试创建一个 NamedTuple,其中一个字段默认为空字典。这大部分都有效,但是默认值在 NamedTuple 的实例之间共享: from typing import NamedTuple,
我正在寻找一种类似结构的数据结构,我可以从中创建多个实例并具有某种类型提示而不是不可变的。 所以我有这样的东西: class ConnectionConfig(NamedTuple): nam
在下面的代码中: point=namedtuple('point','x y') 我很困惑,一个类被视为一个值。就像我做的那样: class point: ... 它在命名空间中创建一个名为
考虑以下扩展 list 并附加 orderedtuple 的类: from collections import namedtuple Order = namedtuple('Order', ['id
我一直在使用这个基本代码来构建一个简单的库存系统。我需要扩展它以跟踪离开库存的另一个零件列表。我想我可以通过为数据结构创建另一个命名元组来做到这一点。我遇到一些问题,因为两个命名元组需要存在并同时访问
Python namedtuple 工厂函数允许它创建的子类的名称被指定两次——第一次在声明的左侧,然后作为函数的第一个参数(IPython 1.0.0 , Python 3.3.1): In [1]
最近我有一个关于数据类型的问题。 从那时起,我一直在尝试使用 NamedTuples(或多或少取得了成功)。 我目前的问题: - 如何将行从文件导入到新元组, - 如何将以空格/制表符(/无论什么)分
我有一个类,它几乎没有静态字段,并且是从可迭代对象初始化的(比如 csvreader 的输出)。 __init__ 为其中一些执行从字符串到数字的类型转换: class PerformanceTest
我知道 collections.namedtuple 的存在和目的,但我注意到,至少在 IDLE (3.2.2) 中,这个工厂函数也在 functools: >>> import functools
我想存储一个维度 namedtuple (x, y)。在我的整个程序中我只需要一次。 我能做到: Dimension = namedtuple('Dimension', ['x', 'y']) dim
有没有办法为 python 中的 namedtuple 重载相等运算符 __eq__(self, other)? 我知道这在类和重新定义方法中是可能的,但这对于 namedtuple 是否也可能,您将
这个问题在这里已经有了答案: Why should I use CamelCase for namedtuple? (1 个回答) 关闭 3 年前。 我是 Python 的新手,我一直在阅读在线文档
我们像这样使用 namedtuple: >>> from collections import namedtuple >>> Point = namedtuple('Point', ['x', 'y'
我正在处理命名元组列表。我想在创建每个命名元组后为其添加一个字段。似乎我可以通过将它作为属性引用来做到这一点(如 namedtuple.attribute = 'foo'),但它不会添加到字段列表中。
我正在尝试记录 namedtuple。当我构建文档时,我收到警告 WARNING: duplicate object description 和在记录的函数之后相同的空函数。例如: 如何删除那些别名?
在 Python 3.6 之后,我们有 typing.NamedTuple ,它是 collections.namedtuple() 的类型化版本,我们可以像类一样继承它: class Employe
鉴于我想从类型模块中正确使用命名元组的类型注释: from typing import NamedTuple, List class Foo(NamedTuple): my_list: Lis
我是一名优秀的程序员,十分优秀!