clean approach to decorator that takes optional keyword arguments
Nice little snippet! A couple of minor points:


It's usually better to put the shorter block first in an if else. This stops the else statement being far from the if, making it clearer how the logic flows. 
When comparing to None, check if func is None or similar, rather than comparing to True/False.
Although this is just a toy example, docstrings should always be used to show what the code does and returns.
PEP8 spacing between imports, functions and code.
Argument names could be better but without knowing the application it's hard to say what they should be.


from functools import partial, wraps


def decorator(func=None, **kwargs):
    """
    Decorator which optionally takes an argument sayhi (True or False).
    prints 'hi' if True, function is then returned as normal
    """
    if func is None:
        return partial(decorator, **kwargs)
    else:
        @wraps(func)
        def decorated(*func_args, **func_kwargs):
            if kwargs.get('sayhi'):
                print('hi')
            return func(*func_args, **func_kwargs)
        return decorated