- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对 python 感到沮丧的事情之一是,如果我编写这样的函数:
def UnintentionalValueChangeOfGlobal(a):
SomeDict['SomeKey'] = 100 + a
b = 0.5 * SomeDict['SomeKey']
return b
然后像这样运行它:
SomeDict = {}
SomeDict['SomeKey'] = 0
b = UnintentionalValueChangeOfGlobal(10)
print(SomeDict['SomeKey'])
Python 将:1)在函数调用期间查找并使用 SomeDict
,即使我忘记将其作为函数的输入提供; 2) 永久更改 SomeDict['SomeKey']
的值,即使它未包含在函数的返回语句中。
对我来说,这通常会导致变量无意中更改值 - SomeDict['SomeKey']
在这种情况下,当意图仅操作函数输出时,在调用函数后变为 110 b
.
在这种情况下,我更喜欢 python:1) 崩溃,函数内部出现错误,指出 SomeDict
未定义; 2) 在任何情况下,调用函数后都不会永久更改除输出 b
之外的任何变量的值。
我知道不可能在 python 中一起禁用全局变量,但是有一个简单的方法(模块或 IDE 等)可以对我的 python 函数执行静态分析并发出警告当函数使用和/或更改不是函数输出的变量值时?
最佳答案
Python 没有提供任何明显且简单的方法来防止在函数中访问(未声明的)全局名称的原因之一是,在 Python 中,一切(好吧,至少可以分配给名称的一切)都是对象,包括函数、类和模块,因此阻止函数访问未声明的全局名称将导致相当冗长的代码......并且嵌套作用域(闭包等)也无济于事。
当然,尽管全局变量是邪恶的,但有时仍然有合理的理由来改变全局对象。 FWIW,即使是 linter(至少是 pylint 和 pyflakes)似乎也没有任何选项来检测此 AFAICT - 但你必须自己仔细检查,因为我可能忽略了它,或者它可能作为 pylint 存在扩展名或另一个 linter 中。
OTHO,20 多年来我很少遇到此类问题的错误(实际上我不记得发生过一次)。定期应用基本的良好实践 - 尽可能避免副作用的简短函数、有意义的名称和良好的命名约定等、至少对关键部分进行单元测试等 - 似乎足以有效地防止此类问题。
这里的一点是,我有一个关于不可调用全局变量被视为(伪)常量的规则,这通过将它们命名为 ALL_UPPER 来表示。当您实际突变或重新绑定(bind)一个时,这使得它非常变得明显......
作为一个更普遍的规则:Python本质上是一种非常动态的语言(哎呀,你甚至可以在运行时更改对象的类......)并且具有“我们都是同意的成年人”的哲学,所以它是实际上,您会在 Java 等更多“B&D”语言中发现“缺乏”大多数安全防护措施,而是依赖于约定、良好实践和简单的常识。
现在,Python 不仅非常动态,而且还公开了它的大部分内部结构,因此您当然可以(如果它还不存在)编写 pylint extension这至少会检测函数代码中的全局名称(提示:您可以使用 yourfunc.co_code
(py2) 或 yourfunc.__code__
(py3) 访问 the compiled code of a function object,然后检查代码中使用了哪些名称)。但是,除非您必须与一群草率、无纪律的开发人员打交道(在这种情况下,您会遇到另一个问题 - 没有技术解决方案来解决愚蠢问题),否则我的拙见是您在浪费时间。
关于python - 识别 python 函数内全局变量的无意读/写?例如使用静态分析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59050026/
我使用的是linux的windows子系统,安装了ubuntu,bash运行流畅。 我正在尝试使用make,似乎bash 无法识别gcc。尝试将其添加到 PATH,但没有任何改变。奇怪的是 - cmd
ImageMagick 已正确安装。 WAMP 的“PHP 扩展”菜单也显示带有勾选的 php_imagick。除了 Apache 和系统环境变量外,phpinfo() 没有显示任何 imagick
我是这么想的,因为上限是 2^n,并且考虑到它们都是有限机,n 状态 NFA 和具有 2^n 或更少状态的 DFA 的交集将是有效。 我错了吗? 最佳答案 你是对的。 2^n 是一个上限,因此生成的
我有一个大型数据集,其中包含每日值,指示一年中的特定一天是否特别热(用 1 或 0 表示)。我的目标是识别 3 个或更多特别炎热的日子的序列,并创建一个包含每个日子的长度以及开始和结束日期的新数据集。
我有一个向量列表,每个向量看起来像这样 c("Japan", "USA", "country", "Japan", "source", "country", "UK", "source", "coun
是否有任何工具或方法可以识别静态定义数组中的缓冲区溢出(即 char[1234] 而不是 malloc(1234))? 昨天我花了大部分时间来追踪崩溃和奇怪的行为,最终证明是由以下行引起的: // e
我一直在尝试通过导入制表符分隔的文件来手动创建 Snakemake 通配符,如下所示: dataset sample species frr PRJNA493818_GSE120639_SRP1628
我一直在尝试通过导入制表符分隔的文件来手动创建 Snakemake 通配符,如下所示: dataset sample species frr PRJNA493818_GSE120639_SRP1628
我想录下某人的声音,然后根据我获得的关于他/她声音的信息,如果那个人再次说话,我就能认出来!问题是我没有关于哪些统计数据(如频率)导致人声差异的信息,如果有人可以帮助我如何识别某人的声音? 在研究过程
我希望我的程序能够识别用户何时按下“enter”并继续循环播放。但是我不知道如何使程序识别“输入”。尝试了两种方法: string enter; string ent = "\n"; dice d1;
我创建了这个带有一个参数(文件名)的 Bash 小脚本,该脚本应该根据文件的扩展名做出响应: #!/bin/bash fileFormat=${1} if [[ ${fileFormat} =~ [F
我正在寻找一种在 for 循环内迭代时识别 subview 对象的方法,我基本上通过执行 cell.contentView.subviews 从 UITableView 的 contentView 获
我正在尝试在 Swift 中使用 CallKit 来识别调用者。 我正在寻找一种通过发出 URL 请求来识别调用者的方法。 例如:+1-234-45-241 给我打电话,我希望它向 mydomain.
我将(相当古老的)插件称为“thickbox”,如下所述: 创建厚盒时,它包含基于查询的内容列表。 使用 JavaScript 或 jQuery,我希望能够访问 type 的值(在上面的示例中 t
我想编写一些可以接受某种输入并将其识别为方波、三角波或某种波形的代码。我还需要一些产生所述波的方法。 我确实有使用 C/C++ 的经验,但是,我不确定我将如何模拟所有这些。最终,我想将其转换为微 Co
我创建了一个 for 循环,用于在每个部分显示 8 个项目,但我试图在循环中识别某些项目。例如,我想识别前两项,然后是第五项和第六项,但我的识别技术似乎是正确的。 for (int i = 0; i
如何识别 UIStoryboard? 该类具有创建和实例化的方法,但我没有看到带有类似name 的@property。例如 获取 Storyboard对象 + storyboardWithName:b
如何确定所运行的SQLServer2005的版本 要确定所运行的SQLServer2005的版本,请使用SQLServerManagementStudio连接到SQLServer2005,然后运行
这个问题在这里已经有了答案: How to check whether an object is a date? (26 个答案) 关闭2 年前。 我正在使用一个 npm 模块,它在错误时抛出一个空
我正在制作一个使用 ActivityRecognition API 在后台跟踪用户 Activity 的应用,如果用户在指定时间段(例如 1 小时)内停留在同一个地方,系统就会推送通知告诉用户去散步.
我是一名优秀的程序员,十分优秀!