【发布时间】:2021-11-15 07:17:15
【问题描述】:
几天前,我作为初级 Python 开发人员开始在朋友的初创公司工作,我们是唯一的员工。
我注意到他有时会编写奇怪的代码。例如:
@pytest.fixture
def create_user_model_test_data():
positive_numbers_iterator = (
lambda n: type("DeclarativeParametrizedNumbersInfiniteIterator", (), {
"__iter__": lambda self: self,
"__next__": staticmethod(
(
lambda n:
(
lambda arg_dict:
lambda: (
arg_dict.update({"n": arg_dict["n"] + 1}) or arg_dict["n"] - 1,
)
)
({"n": n})
)
(n)
)
})
()
)
positive_numbers_starting_from_zero_iterator = positive_numbers_iterator(0)
# FIXME: dont know why python needs a while to iterate a sequence but anyways
while "1":
for n in next(map(next, [positive_numbers_starting_from_zero_iterator])):
if n == 20: return
create_user(name=f"user-{n}", role=["admin", "user"][n % 2])
我建议改成这样:
N = -1
def iterate_numbers():
N += 1
return N
但是,他说它是不纯的,不是声明性的,不能参数化。我说没有问题,声明式的方式很丑,但他回答说Python很丑,你可以在Haskell中写一个简单的声明式无限迭代器,现在正在考虑用Haskell重写整个项目。我喜欢 Python 并且想学习它,我不知道 Haskell 也不想学习。
请告诉我如何在不改变全局变量的情况下在 Python 中编写一个简单的声明性参数化纯无限数序列,我不想学习 Haskell,我需要说服他坚持使用 Python。
编辑:请注意,迭代器只能用 1 行代码编写,这很好,但我已将其格式化,以便您轻松理解它
【问题讨论】:
-
注意,你的朋友接近使用突变:
arg_dict.update。无论如何,您只需要itertools.count -
注意,您的
iterate_numbers函数根本不是迭代器 -
@juanpa.arrivillaga 是的,.update 是笑话的一部分。另外,create_user 有副作用
-
@Pablo 和
# FIXME: dont know why python needs a while to iterate a sequence but anyways疯了。
标签: python iterator global-variables sequence declarative