{"id":34108869,"url":"https://github.com/4379711/functools_lyl","last_synced_at":"2026-04-06T02:03:14.694Z","repository":{"id":57433387,"uuid":"195908151","full_name":"4379711/functools_lyl","owner":"4379711","description":"一些常用小工具","archived":false,"fork":false,"pushed_at":"2021-06-09T04:00:37.000Z","size":504,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-12-17T01:45:17.305Z","etag":null,"topics":["functools","schedule"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/4379711.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-07-09T01:14:35.000Z","updated_at":"2021-06-09T04:01:32.000Z","dependencies_parsed_at":"2022-08-28T04:40:35.459Z","dependency_job_id":null,"html_url":"https://github.com/4379711/functools_lyl","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/4379711/functools_lyl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4379711%2Ffunctools_lyl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4379711%2Ffunctools_lyl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4379711%2Ffunctools_lyl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4379711%2Ffunctools_lyl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/4379711","download_url":"https://codeload.github.com/4379711/functools_lyl/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4379711%2Ffunctools_lyl/sbom","scorecard":{"id":4002,"data":{"date":"2025-08-11","repo":{"name":"github.com/4379711/functools_lyl","commit":"61b6cdbf304d3eacbffcbf85a27ecf72d3d275d8"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-14T13:09:33.644Z","repository_id":57433387,"created_at":"2025-08-14T13:09:33.644Z","updated_at":"2025-08-14T13:09:33.644Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31456664,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T21:22:52.476Z","status":"online","status_checked_at":"2026-04-06T02:00:07.287Z","response_time":112,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["functools","schedule"],"created_at":"2025-12-14T18:23:18.264Z","updated_at":"2026-04-06T02:03:14.688Z","avatar_url":"https://github.com/4379711.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\r\n# functools\r\n\r\n\r\n##### 一些很有用的工具\r\n\r\n------------\r\n\r\n\r\n\r\n### 使用说明：\r\n\r\n------------\r\n\r\n\u003e pip install geeker\r\n\r\n------------\r\n\r\n\r\n\u003e ~~觉得好用请点个star，分享给更多的人使用~~\r\n------------\r\n\r\n\r\n## schedule：\r\n#### 说明:geeker.schedule是schedule的二次开发,修复原作者代码日期不准确等BUG，并解决任务延迟等问题\r\n    \r\n        \r\n        from geeker import schedule\r\n        import time\r\n        \r\n        def abc():\r\n            print('abc')\r\n        \r\n        # 注册任务\r\n        schedule.every(2).seconds.do(abc)\r\n        schedule.every().day.at(\"10:00\").do(abc)\r\n        \r\n        # 开启任务\r\n        while True:\r\n            # thread_pool=False(默认)不会使用线程池,如果上个任务耗时很长,\r\n            # 在下一次任务启动时间点仍未完成,会造成下次任务延后\r\n            schedule.run_pending()\r\n            \r\n            # 参数max_worker 控制任务的总数,默认是任务数的2倍.\r\n            # 注意,如果设置一个较大值,请考虑内存是否允许\r\n           \r\n            # schedule.run_pending(thread_pool=True, max_worker=5)\r\n            time.sleep(1)\r\n            \r\n------------     \r\n\r\n## MyLog:\r\n#### 说明:将日志分日志等级记录,并自动压缩2019-11-11.info.log.gz\r\n\r\n#### 参数:\r\n            :param dir_path: 日志记录的路径,默认是当前路径下的log文件夹\r\n            :param logger_name: logger对象的名字\r\n            :param info_name: 保存info等级的文件名字\r\n            :param error_name:\r\n            :param warning_name:\r\n            :param debug_name:\r\n            :param interval: 压缩日志的频率,默认是7天\r\n            :param detail: bool值,记录日志是否为详细记录\r\n            :param debug: 是否记录debug,默认不记录\r\n            :param info: 是否记录info,默认记录\r\n            :param error:\r\n            :param warning:\r\n            # 实例方法:\r\n            get_logger()--\u003elogger\r\n    \r\n#### 使用举例:\r\n            from geeker import MyLog\r\n            # 记录四种类型的日志\r\n            logger = MyLog(debug=True).get_logger()\r\n            logger.info('info')\r\n            logger.debug('debug')\r\n            logger.error('error')\r\n            logger.warning('warning')\r\n    \r\n            # # # # # # # # # # # # # # # # # # # # # # # # #\r\n    \r\n            # 只记录错误日志\r\n            logger = MyLog(info=False,warning=False).get_logger()\r\n            logger.info('info')\r\n            logger.debug('debug')\r\n            logger.error('error')\r\n            logger.warning('warning')\r\n#### 注意:\r\n##### MyLog()的实例只会同时存在一个,默认记录首次创建实例的属性.\r\n#### 例如:\r\n    \r\n                mylog = MyLog('./logs/logs/')\r\n                mylog2 = MyLog()\r\n                logger = mylog.get_logger()\r\n                logger2 = mylog2.get_logger()\r\n                logger.info('info')\r\n    \r\n                logger2 = MyLog('./logs/logs2/').get_logger()\r\n                logger2.info('info2')\r\n    \r\n##### 以上两个logger logger2,会以logger(第一次创建实例)的属性为准,日志会存放在./logs/logs/下\r\n    \r\n------------   \r\n\r\n## Concurrency :\r\n#### 说明:控制函数执行频率\r\n\r\n\u003e(仅用于多线程模型,协程无效)\r\n\r\n        from geeker import Concurrency\r\n\r\n        # 每4秒执行5次abc()\r\n\r\n        @Concurrency(5,4)\r\n        def abc():\r\n            pass\r\n        \r\n        # 并发量为5\r\n        @Concurrency(5)\r\n        def abc():\r\n            pass\r\n            \r\n        class Test:\r\n            def __init__(self):\r\n                pass\r\n    \r\n            @Concurrency(3)\r\n            def test(self, a):\r\n                print(a, self)\r\n                time.sleep(a)\r\n\t\t\t\r\n------------\r\n\r\n## run_time:\r\n#### 说明:此装饰器调控函数运行时间\r\n        \r\n        from geeker import runtime\r\n        \r\n        @run_time\r\n        def test(i):\r\n            # int('asfa')\r\n            time.sleep(i)\r\n            print('运行结果:', i)\r\n            \r\n        \u003e\u003e\u003e\r\n            START test(1, {})\r\n            运行结果: 1\r\n            test(1, {}) takes \u003c1.0006\u003e seconds\r\n            STOP test(1, {})\r\n\r\n------------\r\n\r\n##  Singleton:\r\n#### 说明:单例模式,建议使用这个\r\n\r\n    from geeker import Singleton\r\n    # 实例的属性为第一次初始化时的属性\r\n    class Test(Singleton):\r\n        pass\r\n\r\n## SingletonOverride\r\n#### 说明:单例模式\r\n\r\n    from geeker import SingletonOverride\r\n    # 后面创建的实例属性会覆盖前者的实例属性\r\n    class Test(SingletonOverride):\r\n        pass\r\n\r\n------------\r\n\r\n##  TimeOut:\r\n#### 说明:超时装饰器\r\n\r\n### 注意:\r\n##### 此装饰器需要额外的线程数量来控制任务执行,\r\n##### 如在多线程并发情况下使用,请评估机器性能(一般没啥大问题)\r\n\r\n        from geeker import TimeOut\r\n        # 精度为0.1秒\r\n   \t\t\r\n        @TimeOut(4)\r\n        def test(i):\r\n            time.sleep(i)\r\n        \r\n        \r\n        class AA:\r\n        \r\n            @TimeOut(3.0)\r\n            def test(self, i):\r\n                time.sleep(i)\r\n\r\n\r\n------------\r\n\t\r\n\r\n##  MyType:\r\n#### 说明:类属性的类型检查\r\n\r\n        from geeker import MyType  \r\n        \r\n        class Test:\r\n            lll = MyType('str_type1', expect_type=str)\r\n            llll = MyType('str_type2', expect_type=str)\r\n        \r\n            def __init__(self, value, ):\r\n                self.lll = value\r\n                self.llll = value\r\n                \r\n------------\r\n\r\n\r\n##  MyDict:\r\n### 注意:\r\n##### 如需要转换成字典,需要使用dict()可直接转换,转换后可直接存MongoDB\r\n        \r\n        from geeker import MyDict\r\n        a=MyDict()\r\n        a.append_key('key','value')\r\n        a.o=5\r\n        a.c='fasf'\r\n        a.add_key('key0','value0')\r\n        print(dict(a))\r\n        使用dict()函数可以直接转换为字典格式\r\n        \r\n        \u003e\u003e\u003e{\r\n            'key': ['value'],\r\n            'o': 5, \r\n            'c': 'fasf', \r\n            'key0': {'value0'}\r\n            }\r\n                \r\n------------\r\n\r\n## IdGenerator:\r\n#### 说明:分布式唯一ID生成器\r\n    \r\n    from geeker import IdGenerator\r\n    \r\n    id_generator =IdGenerator()\r\n    _id =id_generator.get_id()\r\n\r\n------------\r\n\r\n## show_memory_info:\r\n#### 说明:查看当前python进程占用的内存\r\n\r\n    from geeker import show_memory_info\r\n    \r\n    show_memory_info()\r\n\r\n------------\r\n\r\n## retry:\r\n#### 函数装饰器,捕获某个异常,重新执行,直到设置的最大次数,抛出RuntimeError\r\n\r\n    from geeker import retry\r\n    \r\n    @retry(5, ValueError)\r\n    def test():\r\n        int('asf')\r\n   \r\n------------\r\n\r\n\r\n\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F4379711%2Ffunctools_lyl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F4379711%2Ffunctools_lyl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F4379711%2Ffunctools_lyl/lists"}