检查是否可以安全地评估符号

2024-03-20

我有一根绳子x。我觉得x是某个类型的子类型的字符串表示形式Number。例如,x可能会取值"Float64"。我可以使用以下方法检查这一点:

eval(parse(x)) <: Number

然而,有可能x包含一些危险的东西,比如一些变体"rm(something_important)",所以使用eval在我确定之前这是一个坏主意x是安全的。

有什么方法可以安全地检查是否x是子类型的字符串表示形式Number?

(除了构建所有可能的子类型的字符串数组Number并比较...)


The HDF5.jl https://github.com/timholy/HDF5.jl包必须处理这个问题。它解决了它 https://github.com/timholy/HDF5.jl/blob/76e0265faec79ca5d11b8fb0678169c132fd322e/src/JLD.jl#L834-L842通过解析字符串然后检查结果before eval荷兰国际集团它。如果解析后的字符串是它所认为的valid_type_expression https://github.com/timholy/HDF5.jl/blob/76e0265faec79ca5d11b8fb0678169c132fd322e/src/JLD.jl#L761-L765然后它知道在中进行评估应该是安全的Main命名空间。这允许它从主命名空间中获取自定义类型,而这些类型在baremodule.


更多详细信息:解析任意字符串后,您可以检查返回的对象以查看其评估是否“安全”:

julia> dump(parse("Int"))
Symbol Int

julia> dump(parse("Vector{Int}"))
Expr
  head: Symbol curly
  args: Array(Any,(2,))
    1: Symbol Vector
    2: Symbol Int
  typ: Any

julia> dump(parse("""rm("/")"""))
Expr
  head: Symbol call
  args: Array(Any,(2,))
    1: Symbol rm
    2: ASCIIString "/"
  typ: Any

我们要确保我们永远不会eval可以调用任意行为的表达式。根据您想要支持类型语法的彻底程度,您的解决方案可能非常简单,也可能像我上面链接的 HDF5 解决方案一样复杂。如果您只是追求简单的、非参数化的类型,我们可以大大简化事情:

is_valid_type_expression(ex::Symbol) = true
is_valid_type_expression(ex) = false

function julia_type(string)
    ex = parse(string)
    if is_valid_type_expression(ex)
        try
            typ = eval(Main, ex)
            isa(typ, Type) && typ <: Number && return typ
        end
    end
    error("unsupported type: $string")
end

julia> julia_type("String")
ERROR: unsupported type: String
 in julia_type at none:9

julia> julia_type("Int")
Int64

julia> julia_type("""rm("/")""")
ERROR: unsupported type: rm("/")
 in julia_type at none:9

请注意,任何比符号更复杂的东西都是不允许的eval编辑。之后eval解析表达式时,我们检查以确保该类型是 Type 并且是 Type 的子类型Number。这也将允许自定义子类型Number除了内置的之外,因为我们正在评估它Main命名空间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查是否可以安全地评估符号 的相关文章

  • 为什么并行填充数组时会出现竞争条件?

    Julia 语言中有一个函数 可以并行地用随机值填充数组并计算其总和 function thread test v Threads threads for i 1 length v inbounds v i rand end sum v e
  • julia:在没有互联网的情况下创建和使用本地包

    我正在尝试创建 Julia 语言的包并在项目中使用它 现在我只有一个 jl 文件 我不知道如何用它创建一个包 我读过这个link http julia readthedocs org en latest manual packages 但我
  • Julia:如何在宏中使用 kwargs...?

    说我想要 fn a b c sort true 扩展到 gn a b c sort true 目前 我将其写为 macro fn x args kwargs esc gn x args kwargs end 这似乎不起作用 我如何扩展kwa
  • 如何查看函数来自哪个包?

    如何查看函数 或其他对象 源自哪个包 例如函数 take 这可以通过 which macro which take Base
  • 我可以在 Julia 中专门化类型定义吗?

    Julia 的参数类型实际上定义了一系列包含不同内存布局的类型 我想知道这是否也适用于复合类型中的字段名称和数量 一个简单的例子如下 type mytype Float64 a Float64 b Float64 end type myty
  • 更改 Julia 中的包目录

    我想更改 Julia 中的包目录 默认为 julia v0 4 我想要move it to opt julia v0 4 理想情况下 我想移动已安装的软件包 julia v0 4到新地点 但如果这是不可能的 我可以重新安装它们 我需要做什么
  • 如何生成随机概率分布 julia

    我在字典中有一个键列表 我想为每个项目分配一个 0 到 1 之间的数字 使分配的数字总和为 1 如何做到这一点 我尝试使用 rand 进行一些操作 但没有成功 有什么建议么 更数学的答案是使用狄利克雷分布 https en wikipedi
  • 在 VS Code 中找不到 Julia 包

    我对 vscode 很陌生 之前一直使用 jupyter 笔记本 问题是 当我尝试在 VS Code 中运行 julia 时 它找不到任何已随 jupyter 安装的软件包 我是否必须重新安装所有内容 或者有什么方法可以解决这个问题 Jul
  • 检查是否可以安全地评估符号

    我有一根绳子x 我觉得x是某个类型的子类型的字符串表示形式Number 例如 x可能会取值 Float64 我可以使用以下方法检查这一点 eval parse x lt Number 然而 有可能x包含一些危险的东西 比如一些变体 rm s
  • Julia 作用域:为什么这个函数会修改全局变量?

    我是 Julia 的新手 但到目前为止我还是它的粉丝 但根据多年的 R 编程经验 一些范围规则让我感到困惑 我们来看看这个函数 这与我的预期完全一致 function foo1 x y x t 1 while t lt 1000 t 1 y
  • 朱莉娅:当我有情节时如何找到最佳拟合曲线/方程?

    朱莉娅 当我有情节时如何找到最佳拟合曲线 方程 我有一个用地图绘制的图 但我需要找到一个适合这个的二次方程 正如评论中所说 情节在这里并不重要 只有数据本身是 您可以使用诸如GLM构建数据的 广义 线性模型 并可能绘制它们或使用它们来预测新
  • 如何在 Julia 1.0 中离线安装 julia 包?

    我有自己的 Julia 包 在 Julia 0 6 上运行良好 当我尝试升级到 Julia 1 0 时 我发现在 Julia 1 0 中添加我自己的包更加困难 我不能把它放在 pkg dir 下 在我的情况下 该包只是我本地磁盘上的几个文件
  • 如何在命令行中执行 Julia 代码?

    我最近在 Julia 中转移了我的代码 我想知道如何在命令行中执行 Julia 代码 我知道 Julia 代码可以通过运行一次来 编译 但问题是我需要对集 群上的模拟模型进行参数扫描 我只能使用命令行 而不能使用 REPL 在集群上运行模拟
  • Julia ccall 接口和符号的问题

    我正在尝试使用朱莉娅的ccall与 C 库接口的函数 所有类型和指针都是正确的 并且下面的函数调用成功返回正确的答案 为简洁起见 此处未显示变量定义和设置 ccall vDSP convD libacc Void Ptr T Int64 P
  • 使用 !== 或 != 将 Julia 变量与 `nothing` 进行比较

    在一些 Julia 代码中 何时可以看到条件表达式 例如 if val nothing dosomething end where val是一个类型变量Union Int Nothing 条件有什么区别val nothing and val
  • 如何在 Julia 中提供可重现的样本数据

    Here on stackoverflow com 当我提供样本数据来制作可重现的示例时 我该如何以朱利安方式做到这一点 In R例如dput df 将输出一个字符串 您可以用它来创建df再次 因此 您只需将结果发布到 stackoverf
  • Julia JUMP Gurobi MIP - 查询并存储最佳目标并在运行时绑定

    我通过 Julia 中的 JuMP 包使用 Gurobi 来解决混合整数程序 我想获得一个图表像这个 https i stack imgur com 427LC png 其中还提供了基于 Python 的解决方案 也已在古罗比社区形式 ht
  • 埃拉托斯特尼筛法速度比较:Python 与 Julia

    所以我有一个用 Python 和 Julia 编写的 Eratosthenes 函数的小筛子 并且我正在比较运行时间 这是Python代码 import time def get primes n numbers set range n 1
  • 在 Julia 中提取参数类型

    假设我在 Julia 中编写了一个函数 它接受Dict K V 作为参数 然后创建类型的数组Array K 1 and Array V 1 我怎样才能提取类型K and V来自 Dict 对象 以便我可以使用它们来创建数组 斯文和约翰的答案
  • 用以前的非缺失值填充“缺失”值的有效方法是什么?

    我有一个向量 using Missings v allowmissing rand 100 v rand 100 lt 0 1 missing 最好的填充方式是什么v与最后一个非缺失值 现在 for i val in enumerate v

随机推荐

  • Angular 模块与库

    太棒了 Angular 已经发布了版本 6 并且 CLI 提供了生成库的选项 他们称之为 备受期待的功能 现在 从商业角度来看 我想知道 为什么你实际上需要这个 为什么在现有项目中而不是可以像往常一样通过 npm 安装的单独项目 如果您希望
  • 如何通过设置类来格式化 jsTree 中的“li”和“a”DOM 元素?

    基本上 我有一个 jsTree 我需要格式化它li and a通过向每种类型添加自定义类来实现 DOM 元素 文档不清楚如何执行此操作 据我所知 无法添加自定义类 任何格式都必须通过覆盖 jquery 主题或编辑 jsTree 源代码来实现
  • 只能在草稿应用程序上创建状态为草稿的版本

    我正在使用 Jenkins AndroidAPKUpload 插件 我在 Play 商店中有一个应用程序的草稿版本 该应用程序仅用于内部测试 永远不会向公众发布 我认为这意味着它将永远是一个草案 当我尝试通过插件上传 APK 时 我收到错误
  • hibernate使用注释或使用hibernate配置文件

    我看过很多使用注释 基本上是hibernate注释或JPA注释 来实现hibernate的教程 有教程主要关注使用hibernate配置文件 hbm xml文件 根本没有使用注释 现在我有点困惑 哪种方法更好 我绝对更喜欢使用注释来定义我的
  • sinon 存根 withArgs 可以匹配部分参数但不是全部参数

    我有一个正在存根的函数 该函数会使用多个参数进行调用 我想检查一下只是第一个参数 其余的都是回调函数 所以我不想管它们 因此 我可能有以下 2 个调用 以 ajax 为例 method get sinon stub method get 2
  • Groovy HTTPBuilder:从 GZIPed 分块响应中获取实体内容

    我需要向 Web 服务器发送 POST 请求 并能够读取该服务器发送的响应 我尝试使用 HTTPBuilder lib 和以下代码 def http new HTTPBuilder http myServer http setProxy P
  • 更改 Laravel 5.2 中的登录/注册 URL

    我目前正在编写一个应用程序 该应用程序仅包含公司员工的帐户 而不包含常规网站访问者的帐户 因此 我想将与网站 管理 区域相关的 URL 保留在 admin URL 下 这意味着更改 login to admin login and regi
  • 获取一个 url 参数的数组

    我想获取 url param id 但它不起作用 这里每个人都可以帮助我吗 下面的代码不起作用 Url http localhost 9000 rest alerts ids 123 ids 456 路由配置文件 GET restws al
  • Excel-VBA:需要变量声明吗?

    如果写下面的代码会不会出错 Sub Something Dim i As integer Dim xRange As Range Dim yRange As Range Set xRange Range x table Set yRange
  • 控制 R 散点图中点的大小?

    在 R 中 plot 函数需要一个pch控制图中点的外观的参数 我正在制作具有数万个点的散点图 并且更喜欢一个小但不是太小的点 基本上 我发现pch 太小了 但是pch 19太胖了 中间有什么东西或者有什么方法可以以某种方式缩小这些点吗 A
  • 自定义 ASP.NET 身份

    我正在使用 Identity Server 4 并且已自定义 ASP NET Identity 用户 如下所示 public class ApplicationUser IdentityUser MaxLength 100 public v
  • Java 默认版本在 PATH 更改后不反映

    我当前正在 Java 1 7 0 17 64 位版本上运行 我想使用 Java 32 位版本启动一个应用程序 我更新了 PATH 变量以指向 C Program Files x86 Java jre7 bin Java 32 位版本 然后做
  • 如何在不设置内置错误的情况下触发 mat-date-range-input 的 mat-form-field 中 mat-error 的显示?

    根据问题 我有一个日期范围选择器start and end日期作为mat form field 我想执行自定义验证 例如 确保之间的绝对差异start and end不超过 15 天 并显示mat error在 的里面mat form fi
  • Groovy - 如何延迟 Groovlet 修改重新编译检查

    我是 Groovy 的新手 我正在考虑使用 Groovlets 不是 GRAILS 来替换一些 Servlet 如果我更改 Groovlet 的脚本文件 Groovlet 会重新编译并自动获取更改 包括从 Groovlet 引用的脚本 这对
  • 具有离散值的圆形 SeekBar

    我正在尝试创建一个具有离散非线性值的圆形搜索栏 我还希望这些值出现在圆圈之外 我从 GitHub 上查看了多个版本 其中最有希望的是JesusM https github com JesusM HoloCircleSeekBar但是 我想不
  • Emacs 是否可以运行位于远程服务器上的 Matlab shell?

    我希望能够使用 Matlab 模式 matlab el 来运行 matlab shell 唯一的问题是 Matlab 位于远程主机上 这可能吗 如果是这样 请解释一下 我现在正在和流浪汉玩 但没有成功 Thanks 我刚刚尝试通过 ssh
  • Task.Factory.StartNew 与 Task.Factory.FromAsync

    假设我们有一个 I O 绑定方法 例如进行数据库调用的方法 该方法可以同步和异步运行 那是 Sync IOMethod Async BeginIOMethod EndIOMethod 那么当我们以如下所示的不同方式执行该方法时 在资源利用率
  • 非平凡可复制类型的 C++ 值表示

    C 标准的当前草案 2019 年 3 月 有以下段落 basic types p 4 强调我的 T 类型对象的对象表示是 T 类型对象占用的 N 个 unsigned char 对象的序列 其中 N 等于 sizeof T T 类型对象的值
  • 在 JavaScript 块上使用 HTML 注释仍然有意义吗?

    过去 人们习惯将 HTML 注释标签包裹在 JavaScript 块周围 以防止 旧 浏览器显示脚本 即使 Lynx 足够聪明 可以忽略 JavaScript 那么为什么有些人仍然这样做呢 这些天有什么正当理由吗 编辑 我确实遇到过一种情况
  • 检查是否可以安全地评估符号

    我有一根绳子x 我觉得x是某个类型的子类型的字符串表示形式Number 例如 x可能会取值 Float64 我可以使用以下方法检查这一点 eval parse x lt Number 然而 有可能x包含一些危险的东西 比如一些变体 rm s