多平台统一管理软件接口,如何实现多平台统一管理软件接口
305
2022-08-30
python_函数(参数定义/(单/双星号*/**操作符解包实参:Unpacking Argument Lists)(double/函数文档)/变参函数(不定个数函数)/获取实形参/参名(尝试)
文章目录
references变参函数特点一览
trial code
获取实形参/参名(尝试)
结果
references
截取自python tutorial:
4.7. 定义函数4.8. 函数定义详解
4.8.1. 默认值参数4.8.2. 关键字参数4.8.3. 特殊参数
4.8.3.1. 位置或关键字参数4.8.3.2. 仅位置参数4.8.3.3. 仅限关键字参数4.8.3.4. 函数示例4.8.3.5. 小结
4.8.4. 任意实参列表4.8.5. 解包实参列表4.8.6. Lambda 表达式4.8.7. 文档字符串4.8.8. 函数注解
变参函数特点一览
trial code
# %%# 不定位置参数def positional_args(*x): if len(x) == 0: print('None') else: print(x)# testpositional_args(1) # (1,)positional_args(1, 2, 3) # (1, 2, 3)positional_args() # Nonepositional_args('t', 1, 'hello') # ('t', 1, 'hello')# 不定位置参数不接受关键字参数实参# positional_args(x=1)#TypeError: positional_args() got an unexpected keyword argument 'x'# %%# 不定关键字参数def variables_keys(**x): if len(x) == 0: print('None') else: print(x)# testvariables_keys()variables_keys(x=1, y=2, z='c')variables_keys(x=1, y=2)# 不定关键字参数容器不接受位置参数实参# fd(1, 2)#Expected 0 positional arguments# %%# 关键字参数可以使用位置参数的方式来传实参print("# 关键字参数可以使用位置参数的方式来传实参")def test_default(x="default value"): print(x)test_default() # 6(default value)test_default("overwrite by positional parameter") # 7(overwrite)test_default(x="overwrite by keyword parameter")# 位置参数可以通过使用关键字参数的形式传递实参print("# 位置参数可以通过使用关键字参数的形式传递实参 ")def positional_by_key(x): print(x)positional_by_key(x="by keyword parameter")# %%# 位置参数,默认参数(关键字参数),不定位置参数,不定关键字参数def test(x, y=1, *a, # 保存位置参数序列的元组(经常以*args) **b): # 保存关键字参数的字典 print(x, y, a, b)test(1) # 1 1 () {}test(1, 2) # 1 2 () {}test(1, 2, 3, 4) # 1 2 (3, 4) {}test(x=1, y=2) # 1 2 () {}# 没有合适关键字形参,关键字实参将被传入到关键字参数容器(字典中)保存(即使关键字实参和不定形参容器名称(元组/字典)重名)test(1, a=2) # 1 1 () {'a': 2}test(1, 2, 3, a=4) # 1 2 (3,) {'a': 4}test(1, 2, 3, c=4) # 1 2 (3,) {'c': 4}# got multiple values for argument 'y'# test(1, 2, 3, y=4)
获取实形参/参名(尝试)
import inspect#from cxxulib.printer import print1# 逐行打印函数def print1(iterable,is_dict=0): cnt=0 if(is_dict): iterable=iterable.items() # for item in iterable.items(): # print(item) # for key,value in iterable.items(): # print(key,value) for item in iterable: cnt+=1 # @itemtype={type(item)} print(f"@cnt={cnt};@item={item}")v1 = 123v2 = "aa"argv1 = 'value1'argv2 = 'value2'# get parameter names#通过inspect.signature()方法来获取形参def foo(a, b, c): sig = inspect.signature(foo) # print(a, b, c) print("@sig:",sig) return sigfoo(argv1, argv2, argv2)# local()方法来获取def func(a, b): keys = locals().keys() print(keys) parameters=[key for key in keys] print("@parameters:",parameters) return parametersfunc(v1, v2)# print(func(v1, v2))# 通过func.__code__属性获取# print(func.__code__.co_varnames)# print(func.__code__.co_)#获取传入的实参(不可靠的方法)# 在函数外部获取变量信息loc = locals()# def locals() -> dict[str, Any]# Return a dictionary containing the current scope's local variables.# NOTE: Whether or not updates to this dictionary will affect name lookups in the local scope and vice-versa is implementation dependent and not covered by any backwards compatibility guarantees.def get_argvs(value1, value2): # print(loc) # print1(locals(),is_dict=1) # print(type(loc)) # print1(loc,is_dict=1) # print(loc.keys()) # print(loc.get("loc")) # print(type(loc.get("loc")) # print1(loc.get("loc"), is_dict=1) # print(loc["bbb"]) # vars=loc.pop("loc") # del loc["loc"] # print(loc) # print1(vars,is_dict=1) # print("@type:",type(loc)) argvs = [] # values = inspect.signature(get_argvs) values = [value1, value2] for key in loc: if loc[key] in values: argvs.append(key) print("argvName:", key, ":", loc[key]) print("done!") return argvsprint(get_argvs(argv1, argv2))
结果
@sig: (a, b, c)dict_keys(['a', 'b'])@parameters: ['a', 'b']argvName: argv1 : value1argvName: argv2 : value2done!['argv1', 'argv2']
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~