Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在调用某些方法时使用getattr或getattribute正确引发ImportError

如何在调用某些方法时使用getattr或getattribute正确引发ImportError
EN

Stack Overflow用户
提问于 2020-04-27 10:37:16
回答 1查看 128关注 0票数 0

你好,他们提前感谢你对我的帮助,

请参考以下代码:

代码语言:javascript
运行
AI代码解释
复制
import types

_MSG = ("Failed importing {name}. Please install {name}."
        " Using pip install {name}")

class Empty(): # pylint: disable=too-few-public-methods
    """Empty class for beam API."""
    def __call__(self, *args, **kwargs):
        return None

class DummyBeam(types.ModuleType): # pylint: disable=too-few-public-methods

    DoFn = Empty
    Pipeline = Empty

    def __init__(self, name="apache_beam"):
        super(DummyBeam, self).__init__(name)

    def __getattribute__(self, _):
        if getattr(DummyBeam, _, None) is Empty:

            err_msg = _MSG.format(name=self.__name__)
            raise ImportError(err_msg)

我想检查的是,如果没有安装apache_beam,它将成功加载所有的光束类,如DoFn和pipeline,但调用一些函数会引发错误,请参阅下面的代码以查看上面的代码。

代码语言:javascript
运行
AI代码解释
复制
try:
  import apache_beam as beam
except ImportError:
  beam = DummyBeam()

class SomeFn(beam.DoFn):
  pass

class SomeOtherFn(beam.Pipeline):
  pass

SomeFn()

在上面的代码中,现在访问beam.DoFn会引发错误,但我希望它在访问beam.DoFn时不会引发错误,尽管它在调用SomeFn()时会引发错误。我还尝试用getattr替换getattribute,它没有像我预期的那样给出结果,它在调用SomeFn()时不会引发错误,尽管它对所有代码都运行得很好。

谢谢你调查这个。

EN

回答 1

Stack Overflow用户

发布于 2020-04-27 11:22:25

正如回溯中所示(您应该已经发布了FWIW),您的错误不在于调用SomeFn(),而在于访问SomeFn类定义中的beam.DoFn。原因很明显:您非常明确地指示Python通过简单地覆盖Beam.__getattribute__来做到这一点。

请注意,object.__getattribute__是属性查找的官方默认实现(每当Python看到obj.name或getattr(obj,"name")时都会调用它,除非您完全了解覆盖它的含义并且没有更好的解决方案,否则最好不要使用它。

在这种情况下,非常明显的解决方案是实现__getattr__,只有在无法以任何其他方式解析该属性时,__getattribute__才会将其作为最后的手段来调用。你可以这么说:

还将getattribute替换为getattr不起作用

但我只是在您的代码片段上尝试了一下,它(当然)产生了我所期望的结果。这是否是你所期望的是另一个问题,但由于你既没有发布这个版本的代码,也没有在意解释它是如何“不工作”的,所以在这一点上你不能期待任何答案(提示:“不工作”是一个问题的完全无用的描述)。

作为最后的说明:

它将成功加载所有波束方法,如DoFn和pipeline……在上面的代码中,现在调用beam.DoFn

看起来你对术语有点迷惑。DoFnPipeline是类,而不是方法,而且(如前所述)错误是在访问beam.DoFn时引发的,而不是在调用它时引发的。

编辑:

by不工作我的意思是,当我尝试访问beam.DoFn或SomeFn()时,它也不会给我错误,而使用getattr代替getattribute (...)我想要的是在不访问beam.DoFn的情况下调用someFn时引发错误

好的,看起来你不太了解方法调用表达式的执行顺序。当你这样做的时候

代码语言:javascript
运行
AI代码解释
复制
obj.method()

这实际上是一个快捷方式

代码语言:javascript
运行
AI代码解释
复制
method = obj.__getattribute__("method")
method.__call__()

因此,覆盖__getattribute__不是正确的解决方案(参见上面),并且定义__getattr__在这里是无用的-您的DummyBeam类具有DoFnPipeline属性,因此不会为这些名称调用__getattr__

现在,调用beam.DoFnbeam.Pipeline时没有得到任何异常的原因是这些名称绑定到您的Empty ,而不是该类的实例,所以实际上您永远不会调用Empty.__call__。类中定义的__call__方法仅在调用该类的实例时使用,而不是在实例化该类时使用(在这种情况下,调用的是元类的__call__方法):

代码语言:javascript
运行
AI代码解释
复制
>>> class MyCallable:    
...     def __init__(self):
...         print("in MyCallable.__init__")
...     def __call__(self):
...         print("in MyCallable.__call__")
... 
>>>  
... c = MyCallable()
in MyCallable.__init__
>>> c()
in MyCallable.__call__
>>> 

因此,如果您想要在有人尝试实例化DoFn或̀Pipelineyou either have to make them instances ofEmptyor keep them as they are and renameEmpty.calltoEmpty.newwhich is the first method called bytype.call(type`时引发异常,请将其作为所有类的默认元类)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61456920

复制
相关文章
MFC中属性表单和向导对话框的使用
每次在使用MFC创建一个框架时,需要一步步选择自己的程序的外观,基本功能等选项,最后MFC会生成一个基本的程序框架,这个就是向导对话框;而属性表单则是另外一种对话框,表单上有多个属性页,每点击某一页,会显示该页的内容,最好的例子是Visual C++6.0中的Option对话框; 属性表单的创建: 属性表单上由许多属性页组成,每个属性页都可以在可视化的编辑环境中编辑,需要添加的资源名称是对话框下面的IDD_PROPPAGE_LARGE、IDD_PROPPAGE_MEDIUM, IDD_PROPPAGE_SMALL,
Masimaro
2018/08/31
1.7K0
是时候在项目中使用这个CSS属性了
八月份做移动端项目的时候,同事让我帮忙看个底部安全距离的问题,我立即摩拳擦掌,原因无他,仅仅是因为当天上午我在medium闲逛时,正好看到了这篇文章:You have to start using this CSS property in your websites(https://bootcamp.uxdesign.cc/you-have-to-start-using-this-css-property-in-your-websites-7353f46def79) 我是被标题骗进去的。
刘小夕
2021/10/18
6390
是时候在项目中使用这个CSS属性了
css opacity属性_CSS中的opacity属性[通俗易懂]
With the growing need of making websites, the need for styling them has also increased. Therefore, CSS has become an indispensable part of creating websites. Thus one must be aware of which properties to use while creating a website.
全栈程序员站长
2022/09/01
3.2K0
css opacity属性_CSS中的opacity属性[通俗易懂]
「css基础」Transforms 属性在实际项目中如何应用?
关于Transform变形属性大家都不陌生吧,可以通过此属性实现元素的位移translate(x,y),缩放scale(x,y),2d旋转rotate(angle),3d旋转rotate3d(angle),倾斜变换skew(x-angle,y-angle)等,你也许已经很熟悉了这些属性,或许你也会有这样的困惑,这些属性在实际项目中如何应用呢?
前端达人
2019/07/21
2.6K0
「css基础」Transforms 属性在实际项目中如何应用?
React项目中 使用 CSS Module
由于新的 react-app-rewired@2.x 版本的关系,还需要安装 customize-cra。但是我们这里不需要安装 react-app-rewired@2.x。只需要安装 react-app-rewired@2.0.2-next.0这个版本就可以了。
Vam的金豆之路
2021/11/30
3990
React项目中 使用 CSS Module
由于新的 react-app-rewired@2.x 版本的关系,还需要安装 customize-cra。但是我们这里不需要安装 react-app-rewired@2.x。只需要安装 react-app-rewired@2.0.2-next.0这个版本就可以了。
马克社区
2022/06/20
3990
「css基础」Transforms 属性在实际项目中如何应用?
关于Transform变形属性大家都不陌生吧,可以通过此属性实现元素的位移translate(x,y),缩放scale(x,y),2d旋转rotate(angle),3d旋转rotate3d(angle),倾斜变换skew(x-angle,y-angle)等,你也许已经很熟悉了这些属性,或许你也会有这样的困惑,这些属性在实际项目中如何应用呢?
前端达人
2019/07/24
3.3K0
「css基础」Transforms 属性在实际项目中如何应用?
那些经常使用的 CSS3属性
实用的css3属性 1、display:flex||inline-flex display flex inline-flex 解释 将对象作为弹性伸缩盒显示 将对象作为内联块级弹性伸缩盒显示 项目中的应用 我当时写过一个因为子元素浮动让div自适应高度的解决办法,使用的是css方法解决的。div高度自适应 下面就是换用display:flex解决 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <titl
潇洒哥和黑大帅
2018/10/23
7310
那些经常使用的 CSS3属性
css 的 opacity 属性
opacity 用于指定元素透明度, 支持 0~1 之间的小数. 默认值 1-完全不透明, 0-完全透明
全栈程序员站长
2022/09/01
6440
css 的 opacity 属性
CSS的display 属性
1.7、compact:CSS 中有值 compact,不过由于缺乏广泛支持,已经从 CSS2.1 中删除。
爱知汇
2020/10/10
1.1K0
解决python3项目中无法使用supervisor的问题
在我的Dockerfile中这样安装 # 安装项目所需的第三方 RUN python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt \ && python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple \ gunicorn \ && python3 -m pip install git+https
简单、
2018/07/17
1.2K0
实用的CSS3属性和使用技巧
CSS可以改进网站的设计并且开拓网站设计更多的可能性,可以令你的网页更具吸引力。对于前端开发者、网站设计师来说,掌握并熟练应用CSS是一项必不可少的技能。
全栈程序员站长
2022/07/15
4210
CSS3之opacity属性的简单使用
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/141344.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/24
3460
CSS3之opacity属性的简单使用
【规范】统一项目中包管理器的使用
Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~ 【规范】统一项目中包管理器的使用 背景介绍: 我们这里暂不说各种包管理器的优缺点,在实际开发中遇到的一个问题就是,你本地经常使用cnpm来安装,但Jenkins自动构建用的npm,偶尔就会出现本地开发很正常但是Jenkins构建失败报警了,为了避免类似问题的出现,也应该要将能统一的都统一规范。 实现原理: 通过preinstall来在执行install前执行指定脚本; 在preinstall脚
前端小鑫同学
2022/12/26
1.4K0
【规范】统一项目中包管理器的使用
CSS中Fixed的属性
下面这个小demo演示一下fixed与父级子级同级的效果展示 这三个div都是【fixed】属性,但你会发现父级的zindex这时压根没盖过子级的z-index 同级的情况下是会被遮罩住的。
2021/11/08
1.5K0
CSS_文本的属性
color:文本颜色 font-family:字体 font-size:字体大小 font-weight:bold;文字加粗 font-style:italic;斜体 text-indent:60px;首行缩进 text-align:center;水平对齐方式 line-height:100px;行高 text-decoration:underline/none; 如果想要段落的一行高一点,但是文字又垂直居中显示,可以尝试下面的代码: { height:100px; line-height:100px; }
bye
2020/11/24
8810
gridview的属性_grid css
protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e) { e.Row.Attributes.Add(“onmouseover”, “this.style.backgroundColor=’#E6F5FA'”); e.Row.Attributes.Add(“onmouseout”, “this.style.backgroundColor=’#ccccff'”); for (int i = 0; i < e.Row.Cells.Count; i++) { e.Row.Cells[i].Attributes.Add(“class”, “linebottom”); } }
全栈程序员站长
2022/09/28
6650
gridview的属性_grid css
常用的CSS属性大全
1. 动画属性 属性 描述 CSS @keyframes 定义一个动画,@keyframes定义的动画名称用来被animation-name所使用。 3 animation 复合属性。检索或设置对象所应用的动画特效。 3 animation-name 检索或设置对象所应用的动画名称 ,必须与规则@keyframes配合使用,因为动画名称由@keyframes定义 3 animation-duration 检索或设置对象动画的持续时间 3 animation-timing-func
十玖八柒
2022/07/28
3.2K0
回顾css的animation属性
异名新接一个需求,实现一个文字的切换,结果发现太久没写css动画,对animation属性已经很陌生,尤其是对steps()函数的理解已经丢掉了。
异名
2020/12/18
9790
回顾css的animation属性
点击加载更多

相似问题

Egit检测制表符是否已更改

10

nginx regex:检测是否存在分隔符

32

phpDocumentor制表符分隔符

13

路径分隔符的grep

38

分隔符之间的Grep?

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文