for x in first_iterable:
for y in second_iterable:
if x != y:
do_something(x)
Попробуйте это с парой range
в качестве итерируемых элементов, и я думаю, вы увидите, что это не делает то, что вы хотите. Вызов do_something(x)
будет происходить каждый раз, когда значения x
и y
не совпадают, возможно, много раз для каждого x
.
Для вашего случая использования вы хотите, чтобы он запускался только один раз для x
и только если он никогда не совпадает с y
. Для этого вам, вероятно, нужен код, похожий на этот:
for x in first_iterable:
if x not in second_iterable:
do_something(x)
Другой способ написания теста not in
- использовать all(x != y for y in second_iterable)
(что будет удобнее для более сложных тестов, чем простое неравенство) , Этот код будет проверять все значения в second_iterable
перед запуском do_something(x)
, а не делать это многократно, если есть много несоответствующих пар.
Чтобы выразить это в терминах вашего текущего кода (обрезать избыточные переменные, связанные с заголовком, до одной и дать ему лучшее имя):
for submission in source.new(limit=50):
crosspost_title = submission.title + " (by X)"
if all(crosspost_title != other.title for other in subreddit.new(limit=200)):
...
Обратите внимание, что это может сделать ваш код более эффективно, если вы перемещаете проверку ваших ключевых слов (например, "string1"
), прежде чем вы убедитесь, что сообщение еще не было перекрестно размещено. Я бы предложил использовать any
для этого теста, а не целую кучу тестов if
с идентичным кодом в них (if any(keyword in title for keyword in ["string1", "string2", ...]):
).
Как knight_killer, на который указывают выше, Вы используете Assert()
функция, утверждая это Assigned(obj)
true
. Конечно, как на наиболее скомпилированных языках, утверждения не выполнены (или даже включены в выход компилятора), если Вы конкретно не включили им, таким образом, Вы не должны полагаться на утверждения для сборок режима выпуска.
Можно, конечно, просто проверить по nil
, а-ля Assert(obj <> nil)
. Однако Assigned()
производит тот же самый выход компилятора и обладает дополнительным преимуществом, что это работает над указателями на методы класса также (которые являются в действительности парой указателей, одного к методу и другого одного к экземпляру класса), таким образом с помощью Assigned()
хорошая привычка состоит в том, чтобы взять.
Не уверенный, что Вы имеете в виду, но Assert(Assigned(MyObject));
довольно коротко и прост в использовании.
Присвоенный (AObject) скажет Вам, если объект будет нолем или нет.
Возможно, стоящий упоминания то, это, если Вы освобождаете объект с помощью AObject. Освободите Присвоенный, все еще возвратит true. Поэтому удостоверьтесь, что Вы освобождаете использование объекта FreeAndNil (AObject).