首页 \ 问答 \ Python中的模块化编译器(Modular Compiler in Python)

Python中的模块化编译器(Modular Compiler in Python)

我正在用Python编写一个编译器,使用PLY (Python Lex-Yacc)库来“编译”编译器。 编译器必须经历许多规则(核心规则的数量最终将少于一百,并且可以扩展)。 因此,为了保持不同类型的规则分离,我在单个modules目录中创建了许多Python模块。

要包含所有规则,我不必将模块包含在此目录中,但我必须将规则(实现为Python函数)包含在当前命名空间中 。 一旦它们存在于那里,编译器的输入将被正确地标记化,解析等。

这是我读过的并尝试过的内容:

  • 使用__import__getattrsys.modules (非常原始,通常不是首选)
  • importlib库(如何获取模块的所有内容?)
  • 很多摆弄__init__.py只是尝试from modules import * ,它将导入模块中的所有内容

但这些似乎都不是我完全满意的。 我无法准确地完成我想要做的任何事情。 所以我的问题是:如何将子模块中Python模块的某些属性导入到顶级模块的运行命名空间中?

感谢您的关注!


I am writing a compiler in Python, using the PLY (Python Lex-Yacc) library to 'compile' the compiler. The compiler has to go through a lot of rules (the number of just the core rules is eventually going to be a little less than a hundred, and they can be extended). So to keep the different types of rules separate, I made many Python modules in a single modules directory.

To include all the rules, I don't have to include the modules in this directory, but I have to include the rules (implemented as Python functions) into the current namespace. Once they simply exist there, the compiler's input will be properly tokenized, parsed, etc.

Here's what I've read about and tried:

  • using __import__, getattr, and sys.modules (very raw and in general not preferred)
  • the importlib library (how do I get everything inside the module?)
  • a lot of fiddling with __init__.py and just trying to from modules import * which will import everything in the modules as well

But none of these seem entirely satisfactory to me. I can't do precisely what I want to do with any of them. So my question is: how can I import some of the attributes of a Python module in a subdirectory into the running namespace of a top-level module?

Thanks for your attention!


原文:https://stackoverflow.com/questions/25096816
更新时间:2019-11-21 11:13

最满意答案

您想使用像stevedore这样的现有插件库。 它将为您提供枚举可导入文件的工具,以及导入这些模块的工具。


You want to use an existing plugin library like stevedore. It will give you the tools to enumerate files that can be imported, and tools to import those modules.

2014-08-02

相关问答

更多

为什么不能从Interface继承(Why can not inherit from Interface)

简单地说,你不能从接口继承,因为接口只提供抽象,而不是功能 。 以下评论中的注释(感谢@Mark Peters和@qqilihq): 接口可以从接口继承 抽象类和接口都是继承形式,但目前只有抽象类支持代码继承。 接口提供类型继承。 在Java 8中,接口也将提供代码继承。 您还可以查看官方Java教程 ,它是Java知识的一个很好的起点。 Simply put, you cannot inherit from interfaces, because interfaces provide only

如何在HIVE中进行数据分发?(How does data distribution happens in bucketing in HIVE?)

在这里查看语言手册 它指出: Hive如何在桶中分配行? 通常,桶号由表达式hash_function(bucketing_column)mod num_buckets确定。 (那里也有'0x7FFFFFFF,但那并不重要)。 hash_function取决于bucketing列的类型。 对于int,它很容易,hash_int(i)== i。 例如,如果user_id是一个int,并且有10个桶,我们希望所有以0结尾的user_id都在桶1中,所有user_id以1结尾在桶2中,等等。对于其他数

GtkSharp:有没有书?(GtkSharp: Do there exist some books?)

你必须写:-)) 说真的,你需要做的就是: 安装GTK运行时 安装GTK# 从GAC获取GTK#程序集并在项目中引用它们 启动glade并创建一个包含一些按钮,文本框等的窗口。 保存glade文件 创建一个新的控制台应用程序并从那里复制单声道gtk#“入门”程序中的文本,或谷歌搜索gtk#hello world程序。 在第6点,您必须使用intellisense来加载glade文件,因为自编写教程以来参数已更改(其他顺序)。 就这样。 您仍然可以告诉visual studio使用Glade打开.

listview中的Android listview适配器(json children)(Android listview adapter in listview (json children))

为什么不使用BaseAdapter,你可以在那里统治与它的外观和使用方式有关的所有内容? 只需实现getCount,getItem和getView。 有关listView的更多信息,请观看“ listView世界 ”讲座。 why not using BaseAdapter , where you rule everything related to how it looks and how it uses the data? just implement getCount,getItem, a

jQuery带有特定标记的简单选项卡(jQuery Simple tabs with a certain markup)

如果您在创建时使用的任何编辑器修改了生成的html,那么就会更简单。 将标题添加到标题并将标签包装在主div中以及创建标签插件所需的标记将保存额外的代码以再次更改它。 这是一个解决方案,但它采用你拥有的并创建jQueryUI选项卡标记: var $outputContainer=$('body'); /* get basic markup from editor source*/ var editorHTML=$('#editorContent').html(); var $content=

Windows Mobile中没有ColumnHeader.Clone?(No ColumnHeader.Clone in windows mobile?)

快速克隆: // Manual clone ColumnHeader ch = new ColumnHeader(); ch.Text = col.Text; ch.TextAlign = col.TextAlign; ch.Width = ch.Width; Quick clone : // Manual clone ColumnHeader ch = new ColumnHeader(); ch.Text = col.Text; ch.TextAlign = col.TextAlign;

将值添加到列表中 - NullPointerException C#(Adding values to a list - NullPointerException C#)

您需要初始化该字段,否则其默认值为null,因为List<T>是引用类型。 使用private List<LockTime> listOfTimes = new List<LockTime>(); You need to initialize the field, otherwise its default value is null because List<T> is a reference type. Use private List<LockTime> listOfTimes = new

CakePHP 3:到处使用的全局变量[重复](CakePHP 3 : global variable to use everywhere [duplicate])

制作一个单独的文件,比如constants.php 定义全局常量并在此处Configure 。 不要忘记在文件顶部添加它 use Cake\Core\Configure; 并通过编写require __DIR__ . DS.'constants.php';将此文件包含在bootstrap.php require __DIR__ . DS.'constants.php'; require __DIR__ . DS.'constants.php'; 更新 : - 将文件constants.php放在

相关文章

更多

最新问答

更多
  • 用于Json解析的Phonegap插件(Phonegap Plugin for Json parsing)
  • ActionScript 2加载另一个加载其他文件的SWF - 相对路径/网址问题(ActionScript 2 load another SWF that loads other files - relative path/url problem)
  • 使用sql将一些列值放入新列中(put some column values in a new column using sql)
  • 在iOS中为NivevehGL设置View的背景图像(Setting the background image of the View for NivevehGL in iOS)
  • 从普通的C#开发人员到普通的Java开发人员需要多长时间?(How long will take from an average C# developer to an average Java developer?)
  • 通过datetimefield SQL Server加入(Joining by datetimefield SQL Server)
  • Python中是否有任何智能打印方法?(Are there any smart print methods in Python?)
  • R中关闭另一个表[关闭](Removing one table from another in R [closed])
  • 枚举数字(Enumerating digits)
  • 我想从现有数组中获取新数组,其中key是旧数组的重复值,value是重复计数?(I want new array from existing array with key as repeated value from old array and value as repeated count?)
  • 如何在不创建实例的情况下调用类方法(How to call a class method without creating an instance)
  • wxHaskell中嵌入的图像(Embedded images in wxHaskell)
  • 蚂蚁战争任务如何运作?(How does the ant war task work?)
  • Windows Workflow 4中的人员活动支持(Human activity support in Windows Workflow 4)
  • 在Firebug的Net Panel中缺少'DomContentLoaded'和'加载'时间信息(Missing 'DomContentLoaded' and 'load' time information in Firebug's Net Panel)
  • 如何抓取页面以查看复选框/广播/文本输入并检测其原始值的更改?(How can I crawl the page for checkbox/radio/text inputs and detect changes to their original values?)
  • Document.ready不起作用(Document.ready won't work)
  • Java序列化问题(Java serialization problem)
  • Javascript:如何在页面刷新时处理令牌验证?(Javascript: How should I handle token verification on page refresh?)
  • 数据库安全:中间“to_be_deleted”列/表?(Database safety: Intermediary “to_be_deleted” column/table?)
  • 使用mayavi时如何删除scalar_cut_plane中的红框和白色箭头?(How to remove the red frame and white arrow in scalar_cut_plane when using mayavi?)
  • 如何延迟MainPage,所以它在加载数据后启动?(How to delay MainPage, so it starts after data is loaded?)
  • 按Enter键更改EditText(Press Enter to change EditText)
  • 使用libavcodec解码时可以裁剪帧大小吗?(Can the frame size be cropped during decoding using libavcodec?)
  • Performance_Python根据元组的3个元素中的2个获得2个元组列表的并集(Performance_Python get union of 2 lists of tuple according to 2 out of the 3 elements of the tuple)
  • 为什么法线会随相机旋转?(Why normals rotate with camera?)
  • 如何将Intent与ListView一起使用?(How do I use Intents with ListView?)
  • html_safe无法使用rails(html_safe not working with rails)
  • 录制没有单独的程序或库的opengl视频(record opengl video without separate program or library)
  • 滚动到特定视图(Scroll to particular view)