3.0a1の新機能 (1)


以下を基にしたまとめ。

print関数

printが文から関数になった。()を付けないとSyntaxErrorが発生。詳細は、PEP 3105を参照。

print(value, ..., file=None, sep=' ', end='\n')  # シグネチャ

print('a', 'b')        # "a b"を出力して改行する
print('a', end=' ')    # "a "を出力。改行しない
print()                # 改行を出力
print("a", file=sys.stderr)  # sys.stderrに出力
print((x, y))          # repr(x, y)を表示。
print('1', '+', '2', '=', '3', sep='')  # "1+2=3"を出力
フォーマット指定

フォーマット指定は、文字列クラスのformatメソッドもしくは、グローバル関数formatで指定できるようになった。詳細は、PEP 3101を参照。

'{0}, {1}, and {c}'.format('a', 'b', c='c')  # "a, b, and c"となる
print(format(10.0, '7.3g')                   # "     10"となる
':-{{}}'.format()                            # ブレースは2つ重ねることによりエスケープ。":-{}"となる
'{0[a]}, {0[b]} and {0[c]}'.format(dict(a='1', b='2', c='3'))  # 辞書も使える。"1, 2 and 3"となる
'My name is {0:8}'.format('Fred')  # フォーマット指定子を:に続けて指定できる。指定子の意味はオブジェクトの型ごとに異なる。この場合"My name is Fred    "となる
'{0:{1}}'.format(a, b)  # フォーマット指定子の位置にパラメータを使える
抽象クラス

abc(Abstract Base Class)モジュールのABCMetaメタクラスを使用する。抽象クラスのメソッドは、super().foo()などのように呼び出す。詳細は、PEP 3119を参照。

from abc import *

class Foo(metaclass=ABCMeta):
    @abstractmethod
    def foo(self):
        print(’foo() in Foo’)

class Bar(Foo):
    def foo(self):
        super().foo()
        print(’foo() in Bar’)

class Baz(Foo):
    def foo(self):
        print(’foo() in Baz’)

for b in [Bar(), Baz()]:
    b.foo()

# 出力
foo() in Foo
foo() in Bar
foo() in Baz
Function Annotations

型に対する制限を付けられるものと思っていたが、よく読んだら単なる注釈で文法的意味はないらしい。詳細は、PEP 3107を参照。

>>> def foo(a: 'x', b: 5+6, c: list) -> max(2, 9):
...   pass
...
>>> foo.__annotations__
{'a': 'x', 'c': <type 'list'>, 'b': 11, 'return': 9}  # Annotationが取り出せる