Я работаю над круговой проблемой. В этой задаче у нас есть объекты, которые помещены в кольцо размером MAX
, и которым назначены идентификаторы от (0 до MAX-1).
У меня есть три простые функции для проверки включений в диапазоне. inRange (i, j, k) проверяет, находится ли i в круговом интервале [j, k [(мнемоника равна i inRange (j, k) ). И у меня то же самое для диапазонов] j, k [и] j, k].
Код в этих трех методах выглядит дублированным от одного метода к другому:
def inRange(i,j,k):
"""
Returns True if i in [j, k[
* 0 <= i, j, k < MAX
* no order is assumed between j and k: we can have k < j
"""
if j <= k:
return j <= i < k
# j > k :
return j <= i or i < k
def inStrictRange(i,j,k):
"""
Returns True if i in ]j, k[
* 0 <= i, j, k < MAX
* no order is assumed between j and k: we can have k < j
"""
if j <= k:
return j < i < k
# j > k :
return j < i or i < k
def inRange2(i,j,k):
"""
Returns True if i in ]j, k]
* 0 <= i, j, k < MAX
* no order is assumed between j and k: we can have k < j
"""
if j <= k:
return j < i <= k
# j > k :
return j < i or i <= k
Знаете ли вы какой-нибудь более чистый способ реализации этих трех методов? Ведь меняются только операторы?!
Подумав о лучшем решении, я придумал:
from operator import lt, le
def _compare(i,j,k, op1, op2):
if j <= k:
return op1(j,i) and op2(i,k)
return op1(j,i) or op2(i,k)
def inRange(i,j,k):
return _compare(i,j,k, le, lt)
def inStrictRange(i,j,k):
return _compare(i,j,k, lt, lt)
def inRange2(i,j,k):
return _compare(i,j,k, lt, le)
Что лучше? Можете ли вы придумать что-нибудь более интуитивное?
Короче говоря, Каким будет Pythonic способ написать эти три оператора?
Кроме того, я ненавижу имена inRange, inStrictRange, inRange2, но не могу вспомнить кристально чистые имена. Есть идеи?
Спасибо.