GVKun编程网logo

如何制作一个python字典,为字典中缺少的键返回键,而不是引发KeyError?

10

本文将介绍删除Python注释/文档字符串的脚本的详细情况,特别是关于python怎么删除指定字符的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于P

本文将介绍删除Python注释/文档字符串的脚本的详细情况,特别是关于python怎么删除指定字符的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Python IDE-具有PyCharm和vs代码的文档字符串、python – 如何使PyCharm中的文档字符串与Jupyter Notebook中的文档字符串一样有用?、python 字符串的方法和注释、Python 文档字符串的知识。

本文目录一览:

删除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代码的文档字符串

如何解决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中的文档字符串一样有用?

python – 如何使PyCharm中的文档字符串与Jupyter Notebook中的文档字符串一样有用?

Jupyter笔记本
键入命令和“()”并按下Jupyter笔记本中的Shift选项卡的文档(一个很好的文档字符串,其中解释了所有参数并显示了示例):

enter image description here

PyCharm
输入命令并按下PyCharm中的Ctrl Q时的文档(仅显示带有推断变量类型的自动生成的文档字符串):

enter image description here

编辑
这个问题涉及外部(例如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:
    """

你会得到:

enter image description here

使用菜单视图=>快速文档.

python 字符串的方法和注释

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 文档字符串

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?

如何制作一个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

如何解决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字典关键字错误?

KeyError:如何解决Python字典关键字错误?

在python编程中,字典是一种非常常见的数据结构,用于存储键值对。而当我们试图访问字典中不存在的键值时,就会遇到keyerror异常。这篇文章将会给出几种解决python字典关键字错误的方法。

  1. 使用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语句块,并输出一个错误信息。

  1. 使用字典的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免费学习笔记(深入)”;

  1. 使用异常处理机制

如果我们希望自定义处理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异常,并输出一个自定义的错误信息。

  1. 使用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

python – pandas.Series在pyplot.hist中引发KeyError

我生成一个Dataframe.我从中拉出一系列花车,然后用直方图绘制它.工作良好.

但是,当我生成该数据的子系列时,使用以下两种描述之一:

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’等?

解决方法

哦,解决了….传递具有其values属性的Series.

plt.hist(u83.values)

有点奇怪.

作为回溯 – 现在我的任何子选择方法都有效.简直就是我通过了plt.hist(u83)而不是plt.hist(u83.values)….蹩脚的.

python – 按字典中的值返回键

python – 按字典中的值返回键

参见英文答案 > Inverse dictionary lookup in Python                                    14个
我试图在给定值的字典中返回密钥

在这种情况下如果’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 – 按字典中的值返回键的相关信息,请在本站查询。

本文标签: