← Back to context

Comment by vlade11115

2 days ago

While the article is very entertaining, I'm not a fan of the pattern matching in Python. I wish for some linter rule that can forbid the usage of pattern matching.

Can you explain why? Genuinely curious as a lover of case/match. My only complaint is that it is not general enough.

Should be easily doable with a semgrep rule, e.g.:

    ~> cat semgrep.yaml
    rules:
      - id: no-pattern-matching
        pattern: |
          match ...:
        message: |
          I'm not a fan of the pattern matching in Python
        severity: ERROR
        languages:
          - python

...

    ~> cat test.py
    #!/usr/bin/env python3

    foo = 1
    match foo:
      case 1:
        print("one")

...

    ~> semgrep --config semgrep.yaml test.py   


     no-pattern-matching
          I'm not a fan of the pattern matching in Python
                                                         
            4┆ match foo:
            5┆   case 1:
            6┆     print("one")

(exits non-0)

  • You need to make that exclude match = ... since match can also be a variable name. This is because people used to write code like match = re.search(...)

    • The existing pattern suggested above, "match ...:", will not match 'match = ...'.

      Presumably the reason the parent comment suggested semgrep, not just a grep, is because they're aware that naive substring matching would be wrong.

      You could use the playground to check your understanding before implying someone is an idiot.

      https://semgrep.dev/playground/new

If you're experienced enough with Python to say "I want to eliminate pattern matching from my codebase" you can surely construct that as a pre-commit check, no?