在评论建议之前,请阅读底部的注释。问题不在于强类型、动态类型、静态类型的语言等。问题在于开始在程序中的任何地方使用变量,并改变其中一个变量,而不是改变另一个变量将导致巨大的行为变化
如果PyLint
或flake8
有帮助,请用一个示例建议配置,以便我更容易实现。
如果我能做一些类似于类型暗示的事情,看起来比pylint或flake 8更像语法错误,那就太好了。pylint或flake 8是通过稍后运行来检查类似的测试来完成的
在Python中使用的变量如下:
def func():
is_name_appropriate = False
while not is_name_appropriate:
print("Hello World")
is_name_appropriate = True
func()
**Output :**
Hello World
<>强> C++中使用的变量如下:< /强>void func()
{
bool is_name_appropriate = false;
while (is_name_appropriate != True)
{
cout<<"Hello World";
is_name_appropriate = true;
}
}
func();
**Output :**
Hello World
存在编译时错误,在纠正错误后,程序的行为显然没有改变
void func()
{
bool is_name_refactored_appropriate = false; // changed variable name
while (is_name_refactored_appropriate != True) // changed variable name
{
cout<<"Hello World";
is_name_appropriate = true; // Forgot to change this. It will give me compile time error.
}
}
func();
**Output :**
Hello World|
Hello World
Hello World
Hello World
.
.
.
and infinite
is_name_appropriate
现在是一个新变量,程序运行时行为发生了变化。这是我的问题。如何告诉python编译器is_name_appropriate
变量不存在,这是一个错误。类似C++代码的东西。
def func():
is_name_refactored_appropriate = False # changed variable name
while not is_name_refactored_appropriate: # change variable name initialized above
print("Hello World")
is_name_appropriate = True # forgot to change this. I don't use IDE. terminal is great!!!
func()
**Output :**
Hello World|
Hello World
Hello World
Hello World
.
.
.
and infinite
我的程序有30000行代码,很难记住变量的使用位置。重构是非常必要的,所以重构是不可能的
我使用PyCharm Propression Edition作为IDE,但要重构一个使用次数超过50次的名称仍然很困难
注意:上面的代码只是一个示例,实际代码在这里发布非常复杂请不要建议删除上面的while循环。理解这个问题。我也不能更改语言,因为程序中特别需要python,所以请不要这样建议单元测试在这里没有帮助。对不起,伙计们。此处使用BDD。
我建议在代码中添加type hints,并使用MyPy进行静态类型检查。我发现,在维护和重构大型Python代码库时,这将改变游戏规则。请参见this article以获取详细的工作原理示例
诚然,键入提示并不能解决您所询问的有关在何处重命名局部变量的特定问题。:
类型提示是可选的,这是由设计决定的。它允许您在MyPy可以推断类型的地方省略它们,并且还允许您将类型提示逐渐引入现有的代码库。然而,这确实意味着,即使您在
is_name_refactored_appropriate
上放置了类型提示,MyPy也不会在您分配给is_name_appropriate
的行上给您一个错误,因为它认为您想要创建一个新变量然而,重命名局部变量通常不是重构的大障碍,因为它们只能从它们所使用的函数中引用。如果重命名局部变量,唯一可能中断的是它所使用的函数。这意味着,即使是简单的文本搜索和替换也是更改本地变量名称的有效方法
例如,重命名属性或方法问题更大,因为它们可能在程序中的任何位置被引用。例如,如果您试图访问一个不存在的属性或调用一个不存在的方法,MyPy将给您带来错误。这些是需要捕获的真正重要的错误,因为它们本质上是全局性的:如果您重命名一个属性或方法,程序的任何部分都可能发生故障
要将类型提示添加到现有项目中,我将采取将它们引入到您将要重构的区域的方法,因此需要防止破坏。这可以确保您通过引入类型提示所做的工作立即获得回报
相关问题 更多 >
编程相关推荐