此外,在Web上可以找到许多不同的解决方案来创建静态变量.(虽然我还没有看到我喜欢的那个.)
为什么Python不支持方法中的静态变量?这被认为是unpythonic还是与Python的语法有关?
编辑:
我特意询问了设计决策的原因,但我没有提供任何代码示例,因为我想避免解释来模拟静态变量.
我有一堆函数(在任何类之外),我在其上设置了属性,比如funcname.fields = 'xxx'.我希望我可以从函数内部访问这些变量self.fields,但当然它告诉我:
全局名称'self'未定义
那么......我该怎么办?我可以访问一些神奇的变量吗?喜欢__this__.fields?
有几个人问过"为什么?".您可能不同意我的推理,但我有一组函数,所有函数都必须共享相同的签名(只接受一个参数).在大多数情况下,这一个参数足以进行所需的计算.但是,在一些有限的情况下,需要一些额外的信息.我决定只在功能上设置它们,以便很容易被忽略,而不是强迫每个函数接受一长串未使用的变量.
虽然,现在我发现**kwargs如果你不关心额外的args ,你可以使用它作为最后一个参数.那好吧...
编辑:实际上,我没有写的一些功能,宁愿不修改接受额外的args.通过"传入"额外的args作为属性,我的代码可以使用我的自定义函数,利用额外的args,以及不需要额外args的第三方代码.
谢谢你的快速答案:)
我需要理解这个概念,其中我们可以在函数定义中的变量名中使用点 (.)。这里没有类定义,也没有模块,Python 不应该接受包含点的变量名。
def f(x):
f.author = 'sunder'
f.language = 'Python'
print(x,f.author,f.language)
f(5)
`>>> 5 sunder Python`
Run Code Online (Sandbox Code Playgroud)
请解释这是如何可能的,并建议相关文档以供进一步探索。
__repr__用于返回对象的字符串表示,但在 Python 中,函数也是对象本身,并且可以具有属性。
如何设置__repr__函数的?
我在这里看到可以为函数外部的函数设置一个属性,但通常__repr__在对象定义本身内设置一个属性,所以我想在函数定义本身内设置 repr。
我的用例是,我正在使用Tenacity重试具有指数退避功能的网络函数,并且我想记录我最后调用的函数的(信息性)名称。
retry_mysql_exception_types = (InterfaceError, OperationalError, TimeoutError, ConnectionResetError)
def return_last_retry_outcome(retry_state):
"""return the result of the last call attempt"""
return retry_state.outcome.result()
def my_before_sleep(retry_state):
print("Retrying {}: attempt {} ended with: {}\n".format(retry_state.fn, retry_state.attempt_number, retry_state.outcome))
@tenacity.retry(wait=tenacity.wait_random_exponential(multiplier=1, max=1200),
stop=tenacity.stop_after_attempt(30),
retry=tenacity.retry_if_exception_type(retry_mysql_exception_types),
retry_error_callback=return_last_retry_outcome,
before_sleep=my_before_sleep)
def connect_with_retries(my_database_config):
connection = mysql.connector.connect(**my_database_config)
return connection
Run Code Online (Sandbox Code Playgroud)
目前retry_state.fn显示<function <lambda> at 0x1100f6ee0>类似于@chepner 所说的内容,但我想向其中添加更多信息。