Python Single Dispatch确实如广告中所述

时间:2018-06-30 11:27:00

标签: python single-dispatch

我正在测试python的singledispatch:https://docs.python.org/3/library/functools.html?highlight=singledispatch#functools.singledispatch

根据文档,A块应该用作B块。但是,如您在输出中所见,只有B块可以相应地工作。

这是什么问题??谢谢。

   <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/black"
        android:elevation="@dimen/card_spacing_small"
        android:focusable="true"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:title="@android:color/transparent"
        app:contentInsetEnd="0dp"
        app:contentInsetLeft="0dp"
        app:contentInsetRight="0dp"
        app:contentInsetStart="0dp"
        app:titleEnabled="false">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:focusable="true"
            android:gravity="start"
            android:orientation="vertical"
            android:padding="0dp"
            android:visibility="@{viewModel.showCustomToolbar? View.VISIBLE : View.GONE}">


            <TextView
                android:id="@+id/title"
                style="@style/ToolbarTitle.Small"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="left"
                android:focusable="true"
                android:gravity="left"
                android:layout_alignParentTop="true"
                android:text="@string/screen_name"
                android:textSize="18sp"
                android:textStyle="bold" />

            <TextView
                style="@style/ToolbarTitle.Small"
                android:layout_below="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="left"
                android:focusable="true"
                android:gravity="left"
                android:text="@{viewModel.balance}"
                android:textStyle="normal" />

            <ProgressBar
                android:layout_alignParentBottom="true"
                android:id="@+id/progressBar"
                style="@style/Widget.AppCompat.ProgressBar.Horizontal"
                android:layout_marginBottom="0dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:indeterminate="true"/>

        </RelativeLayout>
    </android.support.v7.widget.Toolbar>

输出:

from functools import singledispatch


# Block A
@singledispatch
def divider(a, b=1):
    print(a, b)

@divider.register
def _(a: int, b=1):
    print(a/b)

@divider.register
def _(a: str, b=1):
    print(a[:len(a)//b])

divider(25, 2)
divider('single dispatch practice', 2)


# Block B
@singledispatch
def div(a, b=1):
    print(a, b)


@div.register(int)
def _(a: int, b=1):
    print(a/b)


@div.register(str)
def _(a: str, b=1):
    print(a[:len(a)//b])

div(25 , 2)
div('single dispatch practice', 2)

1 个答案:

答案 0 :(得分:0)

  

我正在测试python的singledispatch(...)这是什么问题?

使用类型注释是正确的,但是@singledispatch仅使用since Python 3.7(注释是在Python 3.0中引入的,在3.4中引入了singledispatch)。因此

# works since 3.4
@foo.register(str)
def foo_str(a: str):
    ...

# works since 3.7
@foo.register
def foo_str(a: str)
    ...