Comments (9)
thanks for your advice, I will write code based on your suggestions later
from latexify_py.
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.
working on this
from latexify_py.
@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.
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.
@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.
- 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
}
- 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.
@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.
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)
- Custom multiplication behavior (option to use \cdot everywhere) HOT 1
- Should `def(x): func(x)` generate `\func x` or `\func \mathopen{}\left( x \mathclose{}\right)`? HOT 2
- Fine-grained control over function name replacements
- Designing "plugin" interface HOT 3
- Use `latex.py` for to standardize codegen HOT 2
- Feedback From a User HOT 14
- Please add support for Python >3.11 HOT 2
- IPython extension to automatically use conversions on displayed objects HOT 1
- Better Identifier For Multi Index and RHS HOT 4
- Can you sub in values for show work? HOT 1
- Сonverting expressions or strings to latex format HOT 5
- Release New Version HOT 6
- Support for sqrt-like nth-roots when rendering x**(1/p)? HOT 2
- Support for log1p and expm1? HOT 4
- `if-elif` statements break if there's no `else` HOT 1
- Typo in \mathopen HOT 3
- Counterintuitive (wrong?) parenthesis when combining exp() and powers HOT 16
- Function docstring and reduce_assignments enabled does not play nice HOT 2
- Include .tex output examples in latexify_py/examples/examples.ipynb HOT 3
- math.pow not working properly on google colab HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from latexify_py.