本文将介绍删除Python注释/文档字符串的脚本的详细情况,特别是关于python怎么删除指定字符的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于P
本文将介绍删除Python注释/文档字符串的脚本的详细情况,特别是关于python怎么删除指定字符的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Python IDE-具有PyCharm和vs代码的文档字符串、python – 如何使PyCharm中的文档字符串与Jupyter Notebook中的文档字符串一样有用?、python 字符串的方法和注释、Python 文档字符串的知识。
本文目录一览:- 删除Python注释/文档字符串的脚本(python怎么删除指定字符)
- Python IDE-具有PyCharm和vs代码的文档字符串
- python – 如何使PyCharm中的文档字符串与Jupyter Notebook中的文档字符串一样有用?
- python 字符串的方法和注释
- Python 文档字符串
删除Python注释/文档字符串的脚本(python怎么删除指定字符)
是否有可用的Python脚本或工具可以从Python源代码中删除注释和文档字符串?
应该注意以下情况:
"""aas"""def f(): m = { u''x'': u''y'' } # faake docstring ;) if 1: ''string'' >> m if 2: ''string'' , m if 3: ''string'' > m
因此,最后我提出了一个简单的脚本,该脚本使用了tokenize模块并删除了注释令牌。它似乎工作得很好,除了我无法在所有情况下都删除文档字符串。看看是否可以改进它以删除文档字符串。
import cStringIOimport tokenizedef remove_comments(src): """ This reads tokens using tokenize.generate_tokens and recombines them using tokenize.untokenize, and skipping comment/docstring tokens in between """ f = cStringIO.StringIO(src) class SkipException(Exception): pass processed_tokens = [] last_token = None # go thru all the tokens and try to skip comments and docstrings for tok in tokenize.generate_tokens(f.readline): t_type, t_string, t_srow_scol, t_erow_ecol, t_line = tok try: if t_type == tokenize.COMMENT: raise SkipException() elif t_type == tokenize.STRING: if last_token is None or last_token[0] in [tokenize.INDENT]: # FIXEME: this may remove valid strings too? #raise SkipException() pass except SkipException: pass else: processed_tokens.append(tok) last_token = tok return tokenize.untokenize(processed_tokens)
我也想在具有良好单元测试覆盖率的大量脚本中对其进行测试。您可以建议这样一个开源项目吗?
答案1
小编典典这可以做到:
""" Strip comments and docstrings from a file."""import sys, token, tokenizedef do_file(fname): """ Run on just one file. """ source = open(fname) mod = open(fname + ",strip", "w") prev_toktype = token.INDENT first_line = None last_lineno = -1 last_col = 0 tokgen = tokenize.generate_tokens(source.readline) for toktype, ttext, (slineno, scol), (elineno, ecol), ltext in tokgen: if 0: # Change to if 1 to see the tokens fly by. print("%10s %-14s %-20r %r" % ( tokenize.tok_name.get(toktype, toktype), "%d.%d-%d.%d" % (slineno, scol, elineno, ecol), ttext, ltext )) if slineno > last_lineno: last_col = 0 if scol > last_col: mod.write(" " * (scol - last_col)) if toktype == token.STRING and prev_toktype == token.INDENT: # Docstring mod.write("#--") elif toktype == tokenize.COMMENT: # Comment mod.write("##\n") else: mod.write(ttext) prev_toktype = toktype last_col = ecol last_lineno = elinenoif __name__ == ''__main__'': do_file(sys.argv[1])
我将存根注释替换为文档字符串和注释,因为它简化了代码。如果完全删除它们,则还必须在它们之前消除缩进。
Python IDE-具有PyCharm和vs代码的文档字符串
如何解决Python IDE-具有PyCharm和vs代码的文档字符串?
我最近切换为使用PyCharm作为我的主要python IDE。我在生成文档字符串时遇到问题。我通常遵循Google标准,PyCharm本身支持该标准,并且在vscode(https://github.com/NilsJPWerner/autoDocstring)上有扩展名。
在vscode中,我获得了很好的自动完成功能,尤其是对于默认和可选参数。但是,在PyCharm中,我只能为类型信息添加一个占位符。下面是两个示例:
生成篡改的代码:
def fun(first,second = 1,third = ''''):
raise NotImplementedError
带有autodocstring的vscode:
"""[summary]
Args:
first ([type]): [description]
second (int,optional): [description]. Defaults to 1.
third (str,optional): [description]. Defaults to ''''.
Raises:
NotImplementedError: [description]
"""
PyCharm:
"""
Args:
first ():
second ():
third ():
Returns:
"""
是否有一种方法可以改善PyCharm可以生成的内容并使它更接近于vscode和autodocstring的组合?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
python – 如何使PyCharm中的文档字符串与Jupyter Notebook中的文档字符串一样有用?
键入命令和“()”并按下Jupyter笔记本中的Shift选项卡的文档(一个很好的文档字符串,其中解释了所有参数并显示了示例):
PyCharm
输入命令并按下PyCharm中的Ctrl Q时的文档(仅显示带有推断变量类型的自动生成的文档字符串):
编辑
这个问题涉及外部(例如matplotlibs或numpy)文档修饰器的评估,而不是如何编写自己的漂亮文档字符串.
解决方法
因为,如果你使用Sphinx/reStructuredText语法,你可以拥有漂亮的文档.
这是一个基本的例子:
def axhline_demo(y=0,xmin=0,xmax=1,hold=None,**kwargs): """ Add a horizontal line across the axis. Parameters ---------- :param y: scalar,optional,default: 0 y position in data coordinates of the horizontal line. :param xmin: scalar,default: 0 etc. :param xmax: more documentation... :param hold: :param kwargs: :return: """
你会得到:
使用菜单视图=>快速文档.
python 字符串的方法和注释
capitalize() |
把字符串的第一个字符改为大写 |
casefold() |
把整个字符串的所有字符改为小写 |
center(width) |
将字符串居中,并使用空格填充至长度 width 的新字符串 |
count(sub[, start[, end]]) |
返回 sub 在字符串里边出现的次数,start 和 end 参数表示范围,可选。 |
encode(encoding=''utf-8'', errors=''strict'') |
以 encoding 指定的编码格式对字符串进行编码。 |
endswith(sub[, start[, end]]) |
检查字符串是否以 sub 子字符串结束,如果是返回 True,否则返回 False。start 和 end 参数表示范围,可选。 |
expandtabs([tabsize=8]) |
把字符串中的 tab 符号(\t)转换为空格,如不指定参数,默认的空格数是 tabsize=8。 |
find(sub[, start[, end]]) |
检测 sub 是否包含在字符串中,如果有则返回索引值,否则返回 -1,start 和 end 参数 表示范围,可选。 |
index(sub[, start[, end]]) |
跟 find 方法一样,不过如果 sub 不在 string 中会产生一个异常。 |
isalnum() |
如果字符串至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False。 |
isalpha() |
如果字符串至少有一个字符并且所有字符都是字母则返回 True,否则返回 False。 |
isdecimal() |
如果字符串只包含十进制数字则返回 True,否则返回 False。 |
isdigit() |
如果字符串只包含数字则返回 True,否则返回 False。 |
islower() |
如果字符串中至少包含一个区分大小写的字符,并且这些字符都是小写,则返回 True, 否则返回 False。 |
isnumeric() |
如果字符串中只包含数字字符,则返回 True,否则返回 False。 |
isspace() |
如果字符串中只包含空格,则返回 True,否则返回 False。 |
istitle() |
如果字符串是标题化(所有的单词都是以大写开始,其余字母均小写),则返回 True, 否则返回 False。 |
isupper() |
如果字符串中至少包含一个区分大小写的字符,并且这些字符都是大写,则返回 True, 否则返回 False。 |
join(sub) |
以字符串作为分隔符,插入到 sub 中所有的字符之间。 |
ljust(width) |
返回一个左对齐的字符串,并使用空格填充至长度为 width 的新字符串。 |
lower() |
转换字符串中所有大写字符为小写。 |
lstrip() |
去掉字符串左边的所有空格 |
partition(sub) |
找到子字符串 sub,把字符串分成一个 3 元组 (pre_sub, sub, fol_sub),如果字符串中不包含 sub 则返回 (''原字符串'', '''', '''') |
replace(old, new[, count]) |
把字符串中的 old 子字符串替换成 new 子字符串,如果 count 指定,则替换不超过 count 次。 |
rfind(sub[, start[, end]]) |
类似于 find() 方法,不过是从右边开始查找。 |
rindex(sub[, start[, end]]) |
类似于 index() 方法,不过是从右边开始。 |
rjust(width) |
返回一个右对齐的字符串,并使用空格填充至长度为 width 的新字符串。 |
rpartition(sub) |
类似于 partition() 方法,不过是从右边开始查找。 |
rstrip() |
删除字符串末尾的空格。 |
split(sep=None, maxsplit=-1) |
不带参数默认是以空格为分隔符切片字符串,如果 maxsplit 参数有设置,则仅分隔 maxsplit 个子字符串,返回切片后的子字符串拼接的列表。 |
splitlines(([keepends])) |
在输出结果里是否去掉换行符,默认为 False,不包含换行符;如果为 True,则保留换行符。。 |
startswith(prefix[, start[, end]]) |
检查字符串是否以 prefix 开头,是则返回 True,否则返回 False。start 和 end 参数可以指 定范围检查,可选。 |
strip([chars]) |
删除字符串前边和后边所有的空格,chars 参数可以定制删除的字符,可选。 |
swapcase() |
翻转字符串中的大小写。 |
title() |
返回标题化(所有的单词都是以大写开始,其余字母均小写)的字符串。 |
translate(table) |
根据 table 的规则(可以由 str.maketrans(''a'', ''b'') 定制)转换字符串中的字符。 |
upper() |
转换字符串中的所有小写字符为大写。 |
zfill(width) |
返回长度为 width 的字符串,原字符串右对齐,前边用 0 填充。 |
|
Python 文档字符串
一、文档字符串
1) Python 是文档字符串。Documentation Strings。
在函数语句块的第一行,且习惯是多行的文本,所以多行使用三引号。
惯例是首字母大写。第一行写概述,空一行,第三行写详细描述,
可以使用特殊属性__doc__ 访问这个文档。
必须写在第一行。
#
def add(x,y):
"""This is s function of addition""" 文档字符串。
a=x+y
return x+y
print("name={} \n doc={}".format(add.__name__,add.__doc__))
print(help(add))
name=add
doc=This is s function of addition
Help on function add in module __main__:
add(x, y)
This is s function of addition
None
2)存在副作用,因为原函数对象的属性都被替换了。
3)#第一次代码
import datetime
import time
def copy_properties(src,dest):
dest.__name__ = src.__name__
dest.__doc__ = src.__doc__
def logger(fn):
def wrapper(*args,**kwargs):
print("args={},kwargs={}".format(args,kwargs))
start = datetime.datetime.now()
ret = fn(*args,**kwargs)
duration = datetime.datetime.now() - start
print("function{}took{}s.".format(fn.__name__,duration.total_seconds()))
return ret
copy_properties(fn,wrapper)
return wrapper
@logger #add = logger(add)
def add(x,y):
"""this is a add function"""
print("===call add =======")
time.sleep(2)
return x+y
print(add(4,y=1),add.__name__,add.__doc__)
#第二次代码(带参装饰器)
import datetime
import time
def copy_properties(src):
def _inner(dest):
dest.__name__ = src.__name__
dest.__doc__ = src.__doc__
return dest
return _inner
def logger(fn):
@copy_properties(fn)
def wrapper(*args,**kwargs):
"""I am wrapper"""
print("args={},kwargs={}".format(args,kwargs))
start = datetime.datetime.now()
ret = fn(*args,**kwargs)
duration = datetime.datetime.now() - start
print("function{}took{}s.".format(fn.__name__,duration.total_seconds()))
return ret
# copy_properties(fn,wrapper)
return wrapper
@logger #add = logger(add)
def add(x,y):
"""this is a add function"""
print("===call add =======")
time.sleep(2)
return x+y
print(add(4,y=1),add.__name__,add.__doc__)
标示符和名称并不是一一对应的。
3) 带参装饰器
通过 copy_properties 函数将被包装函数的属性覆盖掉包装函数。
凡是被装饰的函数都需要复制这些属性,这个函数很通用。
可以将复制属性的函数构建成装饰器函数,带参装饰器。(带参装饰器进行柯里化)。
本质:装饰器函数,装饰别的函数,增强别的(业务函数)函数功能。
#带参装饰器代码
import datetime
import time
def copy_properties(src):
def _inner(dest):
dest.__name__ = src.__name__
dest.__doc__ = src.__doc__
return dest
return _inner
def logger(durtion)
def _logger(fn):
@copy_properties(fn)
def wrapper(*args,**kwargs):
"""I am wrapper"""
print("args={},kwargs={}".format(args,kwargs))
start = datetime.datetime.now()
ret = fn(*args,**kwargs)
delta = (datetime.datetime.now() - start).total_seconds()
print(duration)
if delta>duration:
print(''low'')
else:
print(''fast'')
#print("function{}took{}s.".format(fn.__name__,duration.total_seconds()))
return ret
# copy_properties(fn,wrapper)
return wrapper
return _logger
@logger(5) #add = logger(add)
def add(x,y):
"""this is a add function"""
print("===call add =======")
time.sleep(2)
return x+y
print(add(4,y=1),add.__name__,add.__doc__)
4) 带参装饰器:是一个函数。函数作为他的形参,返回值是一个不带参的装饰器函数。
使用 @functionname(参数列表)方式调用,
可以看做是在装饰器外层又加了一层函数。
函数作为形参。
34、functools 模块。
Functools.update_wrapper(wrapper,wrappered,assigned=WRAPPER_ASSIGNMENTS,updated=WRAPPER_WPDATES)
类似 copy_properties 功能
Wrapper 包装函数、被更新者,wrapper 被包装函数、数据源。
元组 WRAPPER_ASSIGNMENTS 中是要被覆盖的属性。
''__module__'', ''__name__'', ''__qualname__'', ''__doc__'', ''__annotations__''
模块名、名称、限定名、文档、参数注解
元组 WRAPPER_UPDATES 中是要被更新的属性,__dict__属性字典。
增加一个__wrapped__属性,保留着 wrapped 函数。
#代码块
import functools,time,datetime
def logger(durtion,func=lambda name,durtion:print(''{}took{}s''.format(name,durtion))):
def _logger(fn):
def wrapper(*args,**kwargs):
start = datetime.datetime.now()
n = fn(*args,**kwargs)
delta = (datetime.datetime.now() - start).total_seconds()
if delta > durtion:
func(fn.__name__,duration)
return n
return functools.update_wrapper(wrapper,fn)
return _logger
@logger(5) #add = logger(5)(add)
def add(x,y):
time.sleep(1)
return x+y
print(add(5,6),add.__name__,add.__wrapped__,add.__dict__,sep=''\n'')
二、类型注解
1) 函数定义的弊端。
Python 是动态语言,变量可以被赋值,且赋值为不同类型。
难发现,由于不做任何类型检查,直到运行期问题才显现出来,或者线上运行才可以发现。
难使用:函数的使用者看到这个函数的时候,并不知道其函数设计,并不知道应该传入什么类型的参数。
2) 如何解决弊端
(1)增加文档注释。(弊端:函数定义更新了,文档未必同步更新). 使用双的三引号。
(2)函数注解:只是一个提示性文件。对函数参数进行类型注解。对函数参数做一个辅助的说明,并不对函数参数进行类型检查。第三方工具,做代码分析,发现隐藏的 bug。
.__annotations__。
def add(x,y):
"""
:param x:
:param y:
:return: int
"""
return x+y
print(help(add))
(3) 3.6.3 进行的变量注解。I:int = 3
3) 业务应用;函数参数类型检查
(1)函数参数检查,一定是在函数外。
函数应该作为参数,传入到检查函数中。
检查函数拿到函数传入的实际参数。与形参声明进行对比。
__annotations__属性是一个字典,其中包括返回值类型的声明使用 inspect 模块。
(2)inspect。提供获取对象信息的函数,可以检查函数的类、类型检查。
import inspect
def add(x:int,y:int,*args,**kwargs):
return x+y
sig = inspect.signature(add)
print(sig,type(sig))
print(''params:'',sig.parameters)
print(''return:'',sig.return_annotation)
print(sig.parameters[''y''],type(sig.parameters[''y'']))
print(sig.parameters[''x''])
print(sig.parameters[''args''])
print(sig.parameters[''args''].annotation)
print(sig.parameters[''kwargs''])
print(sig.parameters[''kwargs''].annotation)
#第一个 print:(x:int, y:int, *args, **kwargs) <class ''inspect.Signature''> sig 表现出来的是对象,对象是 signature 类型
#第二个 print:params: OrderedDict ([(''x'', <Parameter "x:int">), (''y'', <Parameter "y:int">), (''args'', <Parameter "*args">), (''kwargs'', <Parameter "**kwargs">)]) 类型是映射代理,返回的是有序的字典。Orderdict。
#第三个 print:return: <class ''inspect._empty''> 通过__annotation 查看的是声明的类型。
#第四个 print:y:int <class ''inspect.Parameter''> 返回的是一个类
#第五个 print:x:int 返回的是一个类
#第六个 print:*args 返回的是一个类
#第七个 print:<class ''inspect._empty''> 表示声明的类型,未声明表示空
#第八个 print:**kwargs 返回的是一个类
#第九个 print:<class ''inspect._empty''> 表示声明的类型,未声明表示空
4)模块提供的信息:
Signature(callable)获取签名,(函数签名包含了一个函数的信息包括函数名、参数类型,所在的类和名称空间及其其他信息)
Def add (x,y): add (x,y) 就是函数的签名:
(1)inspect.signature(callable,*,follow_wrapped=True)
(2)Params=sig.parameters()
可变类型收集的就是不同类型数据的,所有后面没有必要加类型注解。
5)模块提供的信息
inspect.isfunction(add) #是否是函数
inspect.ismethod(add) #是否是类方法
inspect.isgenerator(add) #是否是生成器对象
inspect.isgeneratorfunction(add) #是否是生成器函数
inspect.isclass(add) #是否是类
inspect.ismodule(inspect) #是否是模块
inspect.isbuiltin(print) #是否是内建对象
6)Parameter 对象
保存在元组中,只是只读的。
name 参数的名字。
annotaion 参数的注解,可能没有定义。
Default 参数的缺省值,可能没有定义。
empty,特殊得类,用来标记 default 属性或者注释 annotation 属性的空值。
Kind 实参如何绑定到形参,就是形参的类型。
POSITIONAL_ONLY , 值必须是位置参数提供
POSITIONAL_OR_KEYWORD, 值可以作为关键字或者位置参数提供。
VAR_POSITIONAL,可变位置参数,对应 * args
KEYWORD_ONLY,keyword-noly 参数,对应 * 或者 * args 之后出现的非可变关键字参数。
VAR_KEYWORD, 可变关键字参数,对应 **kwargs。
(1) #课堂例子:
import inspect
def add(x,y:int=1,*args,z,t=10,**kwargs):
return x+y
sig = inspect.signature(add)
print(sig)
print(''params:'',sig.parameters)
print(''return:'',sig.return_annotation)
print(''~~~~~~'')
for i,item in enumerate(sig.parameters.items()):
name,param = item
print(i+1,name,param.annotation,param.kind,param.default)
print(param.default is param.empty,end=''\n\n'')
(x, y:int=1, *args, z, t=10, **kwargs)
params: OrderedDict([(''x'', <Parameter "x">), (''y'', <Parameter "y:int=1">), (''args'', <Parameter "*args">), (''z'', <Parameter "z">), (''t'', <Parameter "t=10">), (''kwargs'', <Parameter "**kwargs">)])
return: <class ''inspect._empty''>
~~~~~~
1 x <class ''inspect._empty''> POSITIONAL_OR_KEYWORD <class ''inspect._empty''>
True
2 y <class ''int''> POSITIONAL_OR_KEYWORD 1
False
3 args <class ''inspect._empty''> VAR_POSITIONAL <class ''inspect._empty''>
True
4 z <class ''inspect._empty''> KEYWORD_ONLY <class ''inspect._empty''>
True
5 t <class ''inspect._empty''> KEYWORD_ONLY 10
False
6 kwargs <class ''inspect._empty''> VAR_KEYWORD <class ''inspect._empty''>
True
(2) 业务应用
有函数如下
def add(x, y:int=7) -> int:
return x + y
请检查用户输入是否符合参数注解的要求
#第一步代码:解决位置参数(传入的参数为位置参数)
思路:1, 为了不侵入原来代码,所以使用,装饰器。
2, 导入 inspect 模块。
3, 利用 sig 获取函数签名(add)
4, 利用 sig.paramters(fn)获取对象,是一个有序的字典。
5, 字典里面的 k 放在字典里面,为 list(params.keys())。
6, 字典里面的 v 值放在字典里面,作为找一个列表,list(paramts.values())
7, 用户输入的值利用迭代器取出,判断用户输入的 values 是否和定义的类型一样。
8, 如果为真,打印。
import inspect
def check(fn):
#@funtools.wraps(fn)
def wrapper(*args,**kwargs):
sig = inspect.signature(fn)
params = sig.parameters #有序字典
#keys = [x for x in params.keys()]
keys = list(params.keys())
values = list(params.values()) #参数对象列表
for i,val in enumerate(args):
if isinstance(val,values[i].annotation):
print(keys[i],''=='',val)
#n = fn(*args,**kwargs)
return fn(*args,**kwargs)
return wrapper
@check
def add(x:int,y:int=7)->int:
return x + y
print(add(4,5))
#第二步代码,解决关键词参数传参。(传入的实参采用关键字)
思路:1, 迭代,k,v inkwargs.Items()迭代传参后的字典。
2, 判断类型 v 的类型,与签名得到的有序字典的类型判断是否一致。
3, 类型一致就进行打印。
def check(fn):
def wrapper(*args,**kwargs):
sig = inspect.signature(fn)
params = sig.parameters #有序字典
keys = list(params.keys()) #定义的
values = list(params.values())# 定义的
for i,val in enumerate(args): #形参和实参声明一致
if isinstance(val,values[i].annotation):
print(keys[i],''=='',val)
for k,v in kwargs.items():
if isinstance(v,params[k].annotation):
print(k,''===='',v)
return fn (*args,**kwargs)
return wrapper
@check
def add(x:int,y:int=1):
return x+y
print(add(3,y=4))
#第三步,解决传参为位置参数和关键字参数混合传参。
import inspect
def check(fn):
def wrapper(*args,**kwargs):
sig = inspect.signature(fn)
params = sig.parameters
keys = list(params.keys())
values = list(params.values())
for i,val in enumerate(args):
if isinstance(val,values[i].annotation):
print(keys[i],''=='',val)
for k,v in kwargs.items(): #迭代定义的传参后的字典,
if isinstance(v,params[k].annotation): #判断传参后的v与定义的比较。
print(k,''==='',v)
return fn(*args,**kwargs)
return wrapper
@check
def add(x:int,y:int=1):
return x+y
print(add(3,y=4))
#第四步;解决没有注解的不进行比较的问题:
思路:采用短路与解决,如果不是定义类型的,就不会进行下一步比较、
import inspect
def check(fn):
def wrapper(*args,**kwargs):
sig = inspect.signature(fn)
params = sig.parameters
keys = list(params.keys())
values = list(params.values())
for i,val in enumerate(args):
if values[i].annotation is not inspect._empty and isinstance(val,values[i].annotation):
print(keys[i],''=='',val)
for k,v in kwargs.items(): #迭代定义的传参后的字典,
if params[k].annotation is not params[k].empty and isinstance(v,params[k].annotation): #判断传参后的v与定义的比较。
print(k,''==='',v)
return fn(*args,**kwargs)
return wrapper
@check
def add(x:int,y:int=1):
return x+y
print(add(3,y=4))
Inpsect 模块主要是做检查,检查函数,缺省值等。
我们今天的关于删除Python注释/文档字符串的脚本和python怎么删除指定字符的分享就到这里,谢谢您的阅读,如果想了解更多关于Python IDE-具有PyCharm和vs代码的文档字符串、python – 如何使PyCharm中的文档字符串与Jupyter Notebook中的文档字符串一样有用?、python 字符串的方法和注释、Python 文档字符串的相关信息,可以在本站进行搜索。
在这篇文章中,我们将带领您了解如何制作一个python字典,为字典中缺少的键返回键,而不是引发KeyError?的全貌,同时,我们还将为您介绍有关ids 字典中的 kivy KeyError、KeyError:如何解决Python字典关键字错误?、python – pandas.Series在pyplot.hist中引发KeyError、python – 按字典中的值返回键的知识,以帮助您更好地理解这个主题。
本文目录一览:- 如何制作一个python字典,为字典中缺少的键返回键,而不是引发KeyError?
- ids 字典中的 kivy KeyError
- KeyError:如何解决Python字典关键字错误?
- python – pandas.Series在pyplot.hist中引发KeyError
- python – 按字典中的值返回键
如何制作一个python字典,为字典中缺少的键返回键,而不是引发KeyError?
我想创建一个python字典,将字典中缺少的键的键值返回给我。
用法示例:
dic = smart_dict()dic[''a''] = ''one a''print(dic[''a''])# >>> one aprint(dic[''b''])# >>> b
答案1
小编典典dict
__missing__
对此有一个钩子:
class smart_dict(dict): def __missing__(self, key): return key
ids 字典中的 kivy KeyError
如何解决ids 字典中的 kivy KeyError?
我有以下代码片段:
def on_articles(self,*args):
#self.parent.ids[''recommendations''].update_recommendations(self.articles)
self.parent.children[0].update_recommendations(self.articles)
注释行不起作用,因为 self.parent.ids
是一个空字典 ({}
)
未注释的行确实有效。为什么?如何最好地参考“推荐”小部件?
这是用户界面。
Builder.load_string(''''''
<SearchItem>:
canvas.before:
Color:
rgba: [0.8,0.8,1] if self.state == ''normal'' else [30/255,139/255,195/255,1]
Rectangle:
size: self.size
pos: self.pos
Color:
rgba: 0,1
Line:
rectangle: self.x,self.y,self.width,self.height
color: 0,1
<Urlpopup>:
size_hint: .7,.7
auto_dismiss: False
title: ''''
BoxLayout:
canvas.before:
Color:
rgba: 1,1,1
Rectangle:
size: self.size
pos: self.pos
orientation: ''vertical''
padding: self.width * 0.1
spacing: self.height * 0.1
Spinner:
id: spinner
size_hint: None,None
size: 100,44
text: ''en''
values: ''en'',''fr'',''de'',''it''
SearchBar:
id: searchbar
size_hint: 1,0.4
multiline: False
font_size: self.height*0.8
Recommendations:
id: recommendations
orientation: ''vertical''
SearchItem
'''''')
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
KeyError:如何解决Python字典关键字错误?
在python编程中,字典是一种非常常见的数据结构,用于存储键值对。而当我们试图访问字典中不存在的键值时,就会遇到keyerror异常。这篇文章将会给出几种解决python字典关键字错误的方法。
- 使用in操作符
在访问字典中可能不存在的键值时,我们可以使用in操作符来判断该键值是否存在于字典中。例如:
my_dict = {"apple": 1, "banana": 2, "orange": 3} if "pear" in my_dict: print(my_dict["pear"]) else: print("The key ''pear'' does not exist in the dictionary.")
上述代码中,我们首先创建了一个字典my_dict,并使用in操作符来判断键值"pear"是否存在于该字典中。由于该键值不存在,因此程序会执行else语句块,并输出一个错误信息。
- 使用字典的get方法
除了使用in操作符外,我们还可以使用字典的get方法来避免KeyError异常。get方法可以接受两个参数,第一个参数是要查找的键值,第二个参数是当键值不存在时返回的默认值。例如:
my_dict = {"apple": 1, "banana": 2, "orange": 3} print(my_dict.get("pear", "The key ''pear'' does not exist in the dictionary."))
上述代码中,get方法首先会查找键值"pear"是否存在于my_dict中,由于该键值不存在,因此get方法会返回第二个参数,即一个错误信息字符串。
立即学习“Python免费学习笔记(深入)”;
- 使用异常处理机制
如果我们希望自定义处理KeyError异常,可以使用Python的异常处理机制。例如:
my_dict = {"apple": 1, "banana": 2, "orange": 3} try: print(my_dict["pear"]) except KeyError: print("The key ''pear'' does not exist in the dictionary.")
上述代码中,我们使用try-except语句块来捕获KeyError异常,并输出一个自定义的错误信息。
- 使用collections模块的defaultdict类
另外,我们还可以使用Python的collections模块中的defaultdict类来避免KeyError异常。defaultdict类可以接受一个工厂函数作为参数,用于生成默认值。例如:
from collections import defaultdict my_dict = defaultdict(lambda: "The key does not exist in the dictionary.") my_dict["apple"] = 1 my_dict["banana"] = 2 my_dict["orange"] = 3 print(my_dict["pear"])
上述代码中,我们创建了一个defaultdict对象my_dict,并将lambda函数作为参数传入,用于生成默认值。在访问不存在的键值"pear"时,该字典会自动返回lambda函数生成的默认值,而不会引发KeyError异常。
综上所述,以上是几种解决Python字典关键字错误的方法。在实际的编程中,我们可以根据具体情况选择合适的方法来避免KeyError异常的出现。
以上就是KeyError:如何解决Python字典关键字错误?的详细内容,更多请关注php中文网其它相关文章!
python – pandas.Series在pyplot.hist中引发KeyError
但是,当我生成该数据的子系列时,使用以下两种描述之一:
u83 = results['Wilks'][results['Weight Class'] == 83] u83 = results[results['Weight Class'] == 83]['Wilks']
pyplot.hist在该系列上抛出KeyError.
#this works fine plt.hist(results['Wilks'],bins=bins) # type is <class 'pandas.core.series.Series'> print(type(results['Wilks'])) # type is <type 'numpy.float64'> print(type(results['Wilks'][0])) #this histogram fails with a KeyError for both of these selectors: u83 = results['Wilks'][results['Weight Class'] == 83] u83 = results[results['Weight Class'] == 83]['Wilks'] print u83 #type is <class 'pandas.core.series.Series'> print(type(u83)) #plt.hist(u83) fails with a KeyError plt.hist(u83)
我刚刚开始搞乱熊猫.也许我没有正确的方法来做一个sql相当于’select * from table of WeightClass = 83’等?
解决方法
plt.hist(u83.values)
有点奇怪.
作为回溯 – 现在我的任何子选择方法都有效.简直就是我通过了plt.hist(u83)而不是plt.hist(u83.values)….蹩脚的.
python – 按字典中的值返回键
我试图在给定值的字典中返回密钥
在这种情况下如果’b’在字典中,我希望它返回’b’所在的键(即2)
def find_key(input_dict,value): if value in input_dict.values(): return UNKNowN #This is a placeholder else: return "None" print(find_key({1:''a'',2:''b'',3:''c'',4:''d''},''b''))
我想得到的答案是关键2,但我不确定要放什么以获得答案,任何帮助将不胜感激
解决方法
def find_key(input_dict,value): return next((k for k,v in input_dict.items() if v == value),None)
将所有匹配的键作为一组返回:
def find_key(input_dict,value): return {k for k,v in input_dict.items() if v == value}
字典中的值不一定是唯一的.如果没有匹配,则第一个选项返回None,第二个选项返回该情况的空集.
由于字典的顺序是任意的(取决于使用的键和插入和删除历史),所以被认为是“第一”键也是任意的.
演示:
>>> def find_key(input_dict,value): ... return next((k for k,None) ... >>> find_key({1:''a'',''b'') 2 >>> find_key({1:''a'',''z'') is None True >>> def find_key(input_dict,value): ... return {k for k,v in input_dict.items() if v == value} ... >>> find_key({1:''a'',''b'') set([2]) >>> find_key({1:''a'',4:''d'',5:''b''},''b'') set([2,5]) >>> find_key({1:''a'',''z'') set([])
请注意,每次需要搜索匹配的键时,我们都需要循环遍历值.这不是最有效的方法,特别是如果您需要经常将值与键匹配.在这种情况下,创建一个反向索引:
from collections import defaultdict values_to_keys = defaultdict(set) for key,value in input_dict: values_to_keys[value].add(key)
现在你可以直接在O(1)(常数)时间内询问这组键:
keys = values_to_keys.get(value)
这使用集合;字典也没有排序,所以集合在这里更有意义.
我们今天的关于如何制作一个python字典,为字典中缺少的键返回键,而不是引发KeyError?的分享已经告一段落,感谢您的关注,如果您想了解更多关于ids 字典中的 kivy KeyError、KeyError:如何解决Python字典关键字错误?、python – pandas.Series在pyplot.hist中引发KeyError、python – 按字典中的值返回键的相关信息,请在本站查询。
本文标签: