小编Ric*_*ica的帖子

确定分割形状几何体的“左”侧和“右”侧

我的问题是:如何确定已分割的旋转矩形几何图形的哪一边Aside和哪一边是分割该几何图形的任意边的“左”和“右”边?BsideLineString

LineString出于此问题的目的,“左”和“右”被定义为按顺序从一个节点“行走”到另一个节点时分离器的左侧和右侧。

我创建了这个函数,用于将任意几何图形(非集合)分割为两侧shapely- “左”和“右”:

import shapely.geometry as geo
import shapely.ops as ops

def splitLR(geom, splitter):
    """Split a geometry into a 'left' and 'right' side using the shapely API"""
    if not isinstance(splitter, geo.LineString):
        raise TypeError("The splitter must be a LineString")
    if not splitter.is_simple:
        raise ValueError("Only simple splitter objects allowed")
    if hasattr(geom, "__iter__"):
        raise ValueError("Geometry collections not allowed")
    geom_extents = geo.GeometryCollection([geom, splitter]).minimum_rotated_rectangle
    sides = ops.split(geom_extents, splitter)
    try:
        Aside, Bside = sides …
Run Code Online (Sandbox Code Playgroud)

python shapely

4
推荐指数
1
解决办法
2902
查看次数

将内置字典类型转换为 TypedDict

我有这样的东西(非常简单):

# mymodule.py

from typing import TypedDict, cast

D=TypedDict('D', {'x':int, 'y':int})
d = {}
d['x']=1
d['y']=2
d = cast(D, d)
Run Code Online (Sandbox Code Playgroud)

但 mypy 抱怨道:

mymodule.py:9: error: Incompatible types in assignment (expression has type "D", variable has type "Dict[str, int]") Found 1 error in 1 file (checked 1 source file)

将普通字典转换为子类型不应该是有效的吗TypedDict?如果不是,“构建”字典然后声明其类型的正确方法是什么?

请注意,这是非常简单的;实际上,字典是根据比上面给出的更复杂的算法构建的。

更新:即使我更改变量名称而不是尝试转换类型,问题似乎仍然存在。

# mymodule.py

from typing import TypedDict, cast

D=TypedDict('D', {'x':int, 'y':int})
d = {}
d['x']=1
d['y']=2
dd: D = d
Run Code Online (Sandbox Code Playgroud)

error: Incompatible types in assignment (expression has type …

python type-hinting mypy python-typing

4
推荐指数
1
解决办法
4533
查看次数

使用namedtuple的_replace方法更新包含nt的其他数据结构的字段

我正在学习namedtuple.我想找到一种方法,使用该._replace方法,更新namedtuple它们所在的所有外观.

假设我有一个节点列表,以及这些节点定义的元素列表(双节点波束,四节点四边形)和边界("一个节点"元素).

我正在玩这个:

from collections import namedtuple as nt
Node = nt('Node', 'x y')
Beam = nt('Beam', 'i j')
Quad = nt('Quad', 'i j k l')
Boundary = nt('Boundary', 'b')
#Define some nodes:
n1 = Node(0,0)
n2 = Node(0,1)
n3 = Node(1,1)
n4 = Node(1,0)
#And some other things using those nodes:
q1 = Quad(n1,n2,n3,n4)
b1 = Boundary(n1)
be1 = Beam(n1,n4)
Run Code Online (Sandbox Code Playgroud)

现在,如果我换成n1新的Node:

n1 = n1._replace(x=0.5,y=0.5)
print(n1)  # Node(x=0.5,y=0.5)
Run Code Online (Sandbox Code Playgroud)

其他所有项目均未更新:

print(b1)  # Boundary(b=Node(x=0, …
Run Code Online (Sandbox Code Playgroud)

python

3
推荐指数
1
解决办法
1570
查看次数

使用VBA管理同一Word文档中的多个样式定义

TL/DR:我有一个关于如何在下面执行此操作的游戏计划; 但是,我想知道我的计划是否会被证明过于复杂,以及在开始构建这个项目之前需要考虑哪些额外的考虑因素.虽然我不是一个经验丰富的程序员,但我不是要求代码; 我要求有经验的Word VBA程序员反馈我的整个想法/方法是否是一个巨大的错误.

我有一个文档"模板"(还不是模板文件类型 - 我希望如下所述创建它)用于报告.该报告分为不同部分:

Letter to the Client
Table of Contents
Section I
    Title Page
    Body
        1.0
        2.0
Section II
    Title Page
    Body
        1.0
        2.0
Appendix A
    Title Page
    Body
Appendix B
    Title Page
    Body
Run Code Online (Sandbox Code Playgroud)

我希望每个主要的"metasection"(例如Letter,Section I,Section II,Appendices)具有不同的样式和格式.这可以通过为每个元集具有多个样式来实现,例如:

Normal-Letter
Normal-SectionI
Normal-Appendices
Heading1-Letter
Heading1-SectionI
Heading1-Appendices 
Run Code Online (Sandbox Code Playgroud)

这很快就会变得无法管理.

为了避免用户不得不通过大量的样式来找到正确的样式(并且值得注意的是,如果这个报告的用户必须这样做,他们可能不会使用样式AT ALL),这将是不错的如果我可以有相同的样式名称(例如,Normal)取决于它找到的文档的哪个部分.或者换句话说,我希望文档具有多个样式集,具体取决于部分.

用户体验的目标是:

  1. 用户只需根据需要应用Normal样式,Heading1样式等.
  2. 通过Modify Style对话框或其他方式编辑样式时,将更新已注册的特定于部分的样式定义.
  3. 更改样式或打开,保存或打印文档时,样式将自动且透明地应用.
  4. 替代方法:如果自动/透明样式应用程序证明太困难,请使用简单的命令按钮执行样式应用程序.

我在VBA中如何做到这一点的初步想法是:

  1. 编写VBA代码(可能是一个类),使得每个文档部分都有Normals和Heading1s等样式注册表.
  2. 编写样式应用程序子例程,该子例程遍历已注册的文档部分,选择具有每个注册样式的所有部分,并从样式注册表应用特定于部分的样式(保留任何与样式定义不同的样式).
  3. 编写样式更新子例程,自动并透明地更新已注册的样式定义
  4. 样式应用程序子例程执行任何时候样式应用于其中一个注册部分(所以我需要绑定到事件).
  5. 样式更新子例程在注册部分中的样式定义发生更改时执行(所以这是我需要监视的另一个事件).

我以前在超级用户上问了一个关于这个话题的类似问题 …

vba ms-word word-vba office-2013

3
推荐指数
1
解决办法
918
查看次数

逗号语法:语句中的悬挂逗号背后的基本原理是SyntaxError

在Python中,一个变量或文字后跟一个悬挂的逗号是一个 - tuple:

1, # (1,)
Run Code Online (Sandbox Code Playgroud)

...以及一系列以逗号分隔的变量/文字(无论它们是否后跟悬挂的逗号)也是tuple:

1,2, # (1,2)
1,2 # (1,2)
Run Code Online (Sandbox Code Playgroud)

但是,在可调用/函数内部,此语法的处理方式不同,因为逗号用于分隔参数:

bool(5>6,) # False - 5>6 == False
bool((5>6,)) # True - (5>6,) is a non-empty tuple (always True - contents ignored)
Run Code Online (Sandbox Code Playgroud)

第一行似乎只是忽略了悬挂的逗号.第二行创建一个 - tuple(如预期的那样).这也适用于用户定义的函数(不知道它为什么不会):

def f(arg):
    pass
f(1,) # No Error 
Run Code Online (Sandbox Code Playgroud)

还要考虑以下行为assert(这是一个语句,而不是一个函数):

assert 5>6 # AssertionError, as expected 
assert(5>6) # AssertionError, as expected 
assert 5>6, # SyntaxError: invalid syntax
assert(5>6,) # SyntaxWarning: assertion always true, perhaps remove parentheses?
assert 5>6, …
Run Code Online (Sandbox Code Playgroud)

python syntax comma

3
推荐指数
2
解决办法
730
查看次数

用于测试发电机是否"正在运行"和/或已经用尽的标志

摘要

我所追求的是一种确定发电机是否"正在运行"的方法.

细节

我对"当前正在运行"的定义是:

  1. 生成器代码已经开始执行(即,next或者.send(None)某些其他迭代操作,例如for循环,先前已在生成器上执行,AND
  2. 发电机先前没有耗尽/关闭(再次注意,对于上述发电机,.throw(some_error)由于一些新的回路启动而被捕获并且不会耗尽发电机;没有回路或yield from处理错误通常会耗尽发电机).

我知道没有办法(或者至少是一种简单易行的方法)在生成器中"窥视"并查明它是否会StopIteration在下一次迭代中升起.这与发电机的性质是对立的,而不是我所追求的.

例

假设我有一些生成器,g由一些生成器函数创建,f:

def f():
    '''Lots of 1s.'''
    print('I am now running.')
    while True:
        try:
            signal = yield 1
            if signal:
                break
        except GeneratorExit:
            raise #  important so that closing the generator doesn't cause a RuntimeError
        except Exception:
            print('caught exception!')
Run Code Online (Sandbox Code Playgroud)

我们可以这样"初始化"生成器:

>>> g = f()
>>> next(g)
I am now running.
1

# OR:

>>> …
Run Code Online (Sandbox Code Playgroud)

python generator

3
推荐指数
1
解决办法
93
查看次数

更多Pythonic方法使用try,assert定义自定义__eq__方法,除了

下面的代码工作(编辑:实际上,事实证明它没有!),但我不喜欢块return True之后出现的挂起语句try: except:.

class MySlottedClass(object):
    def __new__(klass, **slots):
        klass.__slots__ = []
        for k in slots:
            klass.__slots__.append(k)
        return super(MySlottedClass,klass).__new__(klass)
    def __init__(self, **slots):
        for k,v in slots.items():
            setattr(self,k,v)
        super(MySlottedClass,self).__new__()
    def __eq__(self, other):
        for slot in self.__slots__:
            try:
                assert getattr(self, slot) == getattr(other,slot), "Not Equal"
            except (AssertionError, AttributeError):
                return False
        return True

##Testing
##Note that the above class definition is just a skeleton
##The below objects are created using 4 different but identically defined classes
##In the actual …
Run Code Online (Sandbox Code Playgroud)

python

2
推荐指数
1
解决办法
342
查看次数

使用另一个笔记本中的动态名称/字符串运行 jupyter 笔记本

人们可以使用魔法从另一台笔记本运行 Jupyter 笔记本%run:

%run my_notebook.ipynb
Run Code Online (Sandbox Code Playgroud)

但是,我有希望在 python 变量中运行的笔记本的路径和名称,notebook_name.

是否可以使用%run魔法来运行此笔记本?如果没有,我还可以如何使用变量中包含的名称来运行笔记本str?

python jupyter jupyter-notebook

2
推荐指数
1
解决办法
1435
查看次数

Excel VBA:如何将工作表上的所有当前形状添加到 ShapeRange?

这里有点像 VBA 新手。

我很清楚如何ShapeRange使用单个或多个Shape对象创建一个:

Dim sht As Worksheet
Set sht = MySht
'
'*Add some shapes*
'
Dim shprng As ShapeRange
Set shprng = sht.Shapes.Range(Array(1,2,3))
Run Code Online (Sandbox Code Playgroud)

有没有办法将工作表上所有当前存在的形状添加到shprng?换句话说,是否有ShapeRange从Shapes对象返回 a 的方法......?像这样的东西:

Set shprng = sht.Shapes.Range.SelectAll '<--- Does not work: Type Mismatch
Set shprng = sht.Shapes                 '<--- Same error
Set shprng = sht.Shapes.Range           '<--- Error: Argument not optional
Run Code Online (Sandbox Code Playgroud)

谢谢!

excel vba shapes

1
推荐指数
1
解决办法
1万
查看次数

什么是[d [k]对于d中的k]这样的表达式?

Python新手在这里.

在学习Python时,我遇到了一些非常好的,简洁的代码,例如:

[d[k] for k in d]
Run Code Online (Sandbox Code Playgroud)

我可以立即看到这些表达式有很多可能性("这些类型"含义包含在a中[]).

我不能确定什么这种表达是叫,所以我无法寻找关于如何使用它的信息.对于一些知识渊博的人来说,指导我学习Python文档或讨论这些文档的其他资源,或者提供一些如何有效使用它们的建议会很棒.

python syntax

1
推荐指数
1
解决办法
1354
查看次数