Git Product home page Git Product logo

Comments (9)

chunibyo-wly avatar chunibyo-wly commented on April 28, 2024 1

thanks for your advice, I will write code based on your suggestions later

from latexify_py.

odashi avatar odashi commented on April 28, 2024

possible logic:

inner_config = copy(config if config is not None else Config.defaults())
for each kwarg:
    inner_config.update(kwarg)

inner_process(fn, inner_config)

from latexify_py.

chunibyo-wly avatar chunibyo-wly commented on April 28, 2024

working on this

from latexify_py.

odashi avatar odashi commented on April 28, 2024

@chunibyo-wly
Thanks for working on this. Since this feature should be carefully designed, could you provide your idea about the implementation before throwing PRs?

from latexify_py.

chunibyo-wly avatar chunibyo-wly commented on April 28, 2024

hello, thanks for your reply, could you please give me some time to do some tests?
I will give you answer later

from latexify_py.

odashi avatar odashi commented on April 28, 2024

@chunibyo-wly Sure. I targeted this feature on the release after the next (0.3) so we don't need to rush at this point.

from latexify_py.

chunibyo-wly avatar chunibyo-wly commented on April 28, 2024
  1. I think we could use bitwise and dynamic method creation to do this
from __future__ import annotations

from latexify.constants import CONFIGURATION
from typing import Callable

class Config:
    def __init__(self,
        identifiers: dict[str, str] | None = None,
        reduce_assignments: bool = False,
        use_math_symbols: bool = False,
        use_raw_function_name: bool = False,
        use_signature: bool = True,) -> None:

        self.flag: int = reduce_assignments * CONFIGURATION['reduce_assignments'] \
                    + use_math_symbols * CONFIGURATION["use_math_symbols"] \
                    + use_raw_function_name * CONFIGURATION["use_raw_function_name"] \
                    + use_signature * CONFIGURATION["use_signature"]
        self.identifiers: dict[str, str] = identifiers
        self.expanded_function: set[str] = set()

        for _config in CONFIGURATION:
            setattr(self, _config, self.__make_method_change_flag(_config))
            setattr(self, f"is_{_config}", self.__make_method_use_flag(_config))

    @staticmethod
    def defaults() -> Config:
        return Config()

    def expand_function(self, function: str | list[str]) -> None:
        if type(function) == str:
            self.expanded_function.add(function)
        elif type(function) == list:
            self.expand_function.update(function)

    def __make_method_change_flag(self, config_name: str) -> Callable:
        def _method(enabled: bool | None = True) -> None:
            if enabled:
                self.flag += CONFIGURATION[config_name]
            else:
                self.flag -= CONFIGURATION[config_name]
        return _method

    def __make_method_use_flag(self, config_name: str) -> Callable:
        @property
        def _method() -> bool:
            return (self.flag & CONFIGURATION[config_name]) != 0
        return _method

and constants is look like this:

CONFIGURATION = {
    "reduce_assignments": 0,
    "use_math_symbols": 2,
    "use_raw_function_name": 4,
    "use_signature": 8
}
  1. change frontend get_latex and reserved original parameter for user convenience
def get_latex(
    fn: Callable[..., Any],
    *,
    identifiers: dict[str, str] | None = None,
    reduce_assignments: bool = False,
    use_math_symbols: bool = False,
    use_raw_function_name: bool = False,
    use_signature: bool = True,
    configuration: Config | None = None,
) -> str:

from latexify_py.

odashi avatar odashi commented on April 28, 2024

@chunibyo-wly Thanks! I think we don't need bitset here and it is enough to store individual members for all boolean configs. We basically don't need to care about the efficiency of this class because parsing and codegen are much (maybe a hundred of times) slower.

from latexify_py.

odashi avatar odashi commented on April 28, 2024

I think we can simply define the config class as a dataclass with only nullable members, with the merge method that generates a new Config while maintaining the original config unchanged:

@dataclasses.dataclass
class Config(frozen=True):
    some_flag: SomeType | None
    ...

    def merge(self, *, config: Config | None = None, **kwargs) -> Config:
        def merge_field(name: str) -> Any:
            # Precedence: kwargs -> config -> self
            arg = kwargs.get(name)
            if arg is None and config is not None:
                arg = getattr(config, name)
            if arg is None:
                arg = getattr(self, name)
            return arg

        return Config(
            **{f.name: merge_field(f.name) for f in dataclasses.fields(self)}
        )

then define the defaults with non-null values:

_DEFAULT_CONFIG = Config(
    some_flag=some_value,
    ...
)

In get_latex, we can construct the final config as follows:

def get_latex(fn: Callable[..., Any], *, config: Config | None, **kwargs):
    merged_config = _DEFAULT_CONFIG.merge(config=config, **kwargs)

from latexify_py.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.