最近我对模拟逻辑电路产生了兴趣,因为我在学校上了一门电子学课。我在Python中为逻辑门电路创建了一个功能模拟器。我的实现是可行的,但我想知道它是否可以以任何方式进行优化或改进?项目代码太大,不适合这个问题,但位于https://github.com/barrettkwise/circuitsim。请告诉我任何可以改进的地方。
print("thanks")
print("for")
print("your help!")发布于 2023-06-01 03:57:14
总的来说,您的代码非常好。它似乎工作得很好,而且格式也很好;我特别喜欢您对类型提示的自由使用。我不明白.line系统背后的原因,但这与问题无关。
在gateobject.py和simulator.py中,您可以eval任意用户文本。这是一种糟糕的做法(虽然在这种情况下,self.type被超感知可以最小化潜在的安全风险)。如果用户输入一个无效的门,它将产生一个丑陋的错误,如下所示:
Traceback (most recent call last):
File "", line 1, in
File "", line 1, in
NameError: name 'BADGATE' is not defined相反,尝试使用字典(如operators = {'OR': OR, 'AND': AND...});然后,如果self.type not in operators,您可以从那里处理错误(打印错误消息,exit,raise,自定义错误等等)。这将使您的代码(稍微)更清晰,错误处理/消息(稍微)更好,您的程序(稍微)更快。
您还可以创建一个帮助函数(如def eval_op(op: str, arg1: str, arg2: str) -> str)来为您处理这个问题。
在一些地方,您使用极短的名称导入其他文件,如s、ps或g。通常,您希望避免这种情况,因为它可能导致代码中的变量混淆和重叠。名字不是特别长,所以你可以把它们留在原样上。
您经常使用enumerate,这很好!但是,如果默认值为0,则可以指定enumerate(x 0)。你可以把它留在enumerate(x)。
在simulator.py:15-16中,将变量p_level从0计数到len(self.circuit),只在每个循环结束时增加变量。这可以用for p_level in range(0, len(self.circuit))更好地表达
在simulator.py:18-21上,您可以使用名称curr_ids和curr_vals来表示ids和vlaue,根据您的注释,这些ids和vlaue并不是当前的。是的,它们是您目前正在使用的,但是您可能希望重命名它们以避免混淆。
在simulator.py:49-50上,您可以执行gate.out.value = eval(gate.type)(gate.in1.value, gate.in2.value),并在后面不使用第二个参数。您可能应该将其划分为Gate上的一个方法,例如setOutput()或evalInputs()。
在simulator.py:53上,即使你知道gate.type == "NOT",你也可以做NOT(...)。
在整个程序中,您使用"1"和"0"来表示真和假。如果用True和False代替它们,它将做两件事:第一,它将简化logicops.py函数(即NOT(a: bool) -> bool: !a)。其次,它可能会使您的程序运行得更快和/或使用的空间更少,因为它不是处理字符串,而是处理布尔值。
总之,我建议您寻找更简单的方法来表示您的数据。您似乎对这些概念很在行,并且能够有效地实现它们;您只需要使用for和bool这样的内置程序来简化代码。请给我反馈我的反馈,和快乐的编程!
https://codereview.stackexchange.com/questions/285280
复制相似问题