Автогенерация подходит для простых запросов: в этом случае, вероятно, проще просто определить запрос вручную, тогда вам нужно только 2 параметра.
public interface OrderRepository
extends PagingAndSortingRepository<Order, String>, QuerydslPredicateExecutor<Order> {
@Query("select o from Order o where (o.startDate between ?1 and ?2) " +
"or (o.updatedDate between ?1 and ?2)")
public Page<Order> findByCreatedOrUpdatedBetween(Date startDate, Date endDate,
Pageable pageRequest);
}
На основе ответ John Lin :
def module_property(func):
"""Decorator to turn module functions into properties.
Function names must be prefixed with an underscore."""
module = sys.modules[func.__module__]
def base_getattr(name):
raise AttributeError(
f"module '{module.__name__}' has no attribute '{name}'")
old_getattr = getattr(module, '__getattr__', base_getattr)
def new_getattr(name):
if f'_{name}' == func.__name__:
return func()
else:
return old_getattr(name)
module.__getattr__ = new_getattr
return func
Использование (отмечают начальный символ подчеркивания), в the_module.py
:
@module_property
def _thing():
return 'hello'
Тогда:
import the_module
print(the_module.thing) # prints 'hello'
начальный символ подчеркивания необходим для дифференциации функции свойства-ized от исходной функции. Я не мог думать о способе повторно присвоить идентификатор, с тех пор во время казни декоратора, он еще не был присвоен.
Примечание, что IDE не будут знать, что свойство существует и покажет красный wavies.
Только экземпляры классов нового стиля могут иметь свойства. Вы можете заставить Python поверить, что такой экземпляр является модулем, спрятав его в sys.modules [thename] = theinstance
. Так, например, ваш файл модуля m.py может быть:
import sys
class _M(object):
def __init__(self):
self.c = 0
def afunction(self):
self.c += 1
return self.c
y = property(afunction)
sys.modules[__name__] = _M()
Я бы сделал это, чтобы правильно наследовать все атрибуты модуля и правильно идентифицировать isinstance ()
import types
class MyModule(types.ModuleType):
@property
def y(self):
return 5
>>> a=MyModule("test")
>>> a
<module 'test' (built-in)>
>>> a.y
5
А затем вы можете вставить это в sys.modules:
sys.modules[__name__] = MyModule(__name__) # remember to instantiate the class